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,55 @@
1
+ /**
2
+ * @fileoverview Index of popular pre-built MCP server entries
3
+ * @copyright Copyright (c) 2024-2026 nirholas
4
+ * @license Apache-2.0
5
+ */
6
+
7
+ import type { RegistryEntry } from '../types';
8
+
9
+ // Import all popular entries
10
+ import stripeEntry from './stripe.json';
11
+ import githubEntry from './github.json';
12
+ import notionEntry from './notion.json';
13
+ import slackEntry from './slack.json';
14
+ import openaiEntry from './openai.json';
15
+ import twilioEntry from './twilio.json';
16
+ import supabaseEntry from './supabase.json';
17
+ import vercelEntry from './vercel.json';
18
+ import linearEntry from './linear.json';
19
+ import resendEntry from './resend.json';
20
+
21
+ /**
22
+ * All popular pre-built entries
23
+ */
24
+ export const popularEntries: RegistryEntry[] = [
25
+ stripeEntry as RegistryEntry,
26
+ githubEntry as RegistryEntry,
27
+ notionEntry as RegistryEntry,
28
+ slackEntry as RegistryEntry,
29
+ openaiEntry as RegistryEntry,
30
+ twilioEntry as RegistryEntry,
31
+ supabaseEntry as RegistryEntry,
32
+ vercelEntry as RegistryEntry,
33
+ linearEntry as RegistryEntry,
34
+ resendEntry as RegistryEntry,
35
+ ];
36
+
37
+ /**
38
+ * Get a specific popular entry by ID
39
+ */
40
+ export function getPopularEntry(id: string): RegistryEntry | undefined {
41
+ return popularEntries.find(e => e.id === id);
42
+ }
43
+
44
+ /**
45
+ * Get all categories from popular entries
46
+ */
47
+ export function getPopularCategories(): string[] {
48
+ const categories = new Set<string>();
49
+ for (const entry of popularEntries) {
50
+ for (const cat of entry.categories) {
51
+ categories.add(cat);
52
+ }
53
+ }
54
+ return Array.from(categories).sort();
55
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "id": "linear-mcp",
3
+ "name": "Linear",
4
+ "description": "Linear API - manage issues, projects, cycles, and team workflows",
5
+ "sourceRepo": "linear/linear",
6
+ "sourceUrl": "https://github.com/linear/linear",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v1.0.0",
9
+ "toolCount": 10,
10
+ "tools": [
11
+ { "name": "create_issue", "description": "Create a new issue", "source": "graphql", "paramCount": 6, "requiresAuth": true },
12
+ { "name": "get_issue", "description": "Get an issue by ID", "source": "graphql", "paramCount": 1, "requiresAuth": true },
13
+ { "name": "update_issue", "description": "Update an existing issue", "source": "graphql", "paramCount": 5, "requiresAuth": true },
14
+ { "name": "list_issues", "description": "List issues with filters", "source": "graphql", "paramCount": 4, "requiresAuth": true },
15
+ { "name": "list_projects", "description": "List all projects", "source": "graphql", "paramCount": 2, "requiresAuth": true },
16
+ { "name": "get_project", "description": "Get a project by ID", "source": "graphql", "paramCount": 1, "requiresAuth": true },
17
+ { "name": "list_teams", "description": "List all teams", "source": "graphql", "paramCount": 1, "requiresAuth": true },
18
+ { "name": "list_cycles", "description": "List cycles for a team", "source": "graphql", "paramCount": 2, "requiresAuth": true },
19
+ { "name": "create_comment", "description": "Create a comment on an issue", "source": "graphql", "paramCount": 2, "requiresAuth": true },
20
+ { "name": "search_issues", "description": "Search issues", "source": "graphql", "paramCount": 2, "requiresAuth": true }
21
+ ],
22
+ "categories": ["project-management", "productivity", "api"],
23
+ "tags": ["linear", "issues", "projects", "agile", "workflow", "tasks"],
24
+ "popularity": 7650,
25
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
26
+ "createdAt": "2025-06-01T00:00:00.000Z",
27
+ "generatedCode": {
28
+ "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 LINEAR_API_KEY = process.env.LINEAR_API_KEY;\nconst LINEAR_BASE_URL = 'https://api.linear.app/graphql';\n\nif (!LINEAR_API_KEY) {\n console.error('Error: LINEAR_API_KEY environment variable is required');\n process.exit(1);\n}\n\nconst server = new Server({ name: 'linear-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });\n\nasync function linearGraphQL(query: string, variables?: Record<string, unknown>) {\n const response = await fetch(LINEAR_BASE_URL, {\n method: 'POST',\n headers: {\n 'Authorization': LINEAR_API_KEY,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ query, variables }),\n });\n const result = await response.json();\n if (result.errors) throw new Error(result.errors[0].message);\n return result.data;\n}\n\nconst tools = [\n { name: 'create_issue', description: 'Create a new issue', inputSchema: { type: 'object', properties: { title: { type: 'string' }, description: { type: 'string' }, teamId: { type: 'string' }, priority: { type: 'number' }, assigneeId: { type: 'string' }, labelIds: { type: 'array', items: { type: 'string' } } }, required: ['title', 'teamId'] } },\n { name: 'get_issue', description: 'Get an issue', inputSchema: { type: 'object', properties: { id: { type: 'string' } }, required: ['id'] } },\n { name: 'update_issue', description: 'Update an issue', inputSchema: { type: 'object', properties: { id: { type: 'string' }, title: { type: 'string' }, description: { type: 'string' }, stateId: { type: 'string' }, priority: { type: 'number' } }, required: ['id'] } },\n { name: 'list_issues', description: 'List issues', inputSchema: { type: 'object', properties: { teamId: { type: 'string' }, first: { type: 'number' }, filter: { type: 'object' } } } },\n { name: 'list_projects', description: 'List projects', inputSchema: { type: 'object', properties: { first: { type: 'number' } } } },\n { name: 'get_project', description: 'Get a project', inputSchema: { type: 'object', properties: { id: { type: 'string' } }, required: ['id'] } },\n { name: 'list_teams', description: 'List teams', inputSchema: { type: 'object', properties: {} } },\n { name: 'list_cycles', description: 'List cycles', inputSchema: { type: 'object', properties: { teamId: { type: 'string' }, first: { type: 'number' } } } },\n { name: 'create_comment', description: 'Create a comment', inputSchema: { type: 'object', properties: { issueId: { type: 'string' }, body: { type: 'string' } }, required: ['issueId', 'body'] } },\n { name: 'search_issues', description: 'Search issues', inputSchema: { type: 'object', properties: { query: { type: 'string' }, first: { type: 'number' } }, required: ['query'] } },\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 'create_issue':\n result = await linearGraphQL(`mutation CreateIssue($input: IssueCreateInput!) { issueCreate(input: $input) { success issue { id identifier title url } } }`, { input: a });\n break;\n case 'get_issue':\n result = await linearGraphQL(`query GetIssue($id: String!) { issue(id: $id) { id identifier title description state { name } priority assignee { name } labels { nodes { name } } } }`, { id: a.id });\n break;\n case 'update_issue':\n const { id, ...updateInput } = a;\n result = await linearGraphQL(`mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) { issueUpdate(id: $id, input: $input) { success issue { id identifier title } } }`, { id, input: updateInput });\n break;\n case 'list_issues':\n result = await linearGraphQL(`query ListIssues($first: Int) { issues(first: $first) { nodes { id identifier title state { name } priority assignee { name } } } }`, { first: a.first || 50 });\n break;\n case 'list_projects':\n result = await linearGraphQL(`query ListProjects($first: Int) { projects(first: $first) { nodes { id name state } } }`, { first: a.first || 50 });\n break;\n case 'get_project':\n result = await linearGraphQL(`query GetProject($id: String!) { project(id: $id) { id name description state startDate targetDate } }`, { id: a.id });\n break;\n case 'list_teams':\n result = await linearGraphQL(`query { teams { nodes { id name key } } }`);\n break;\n case 'list_cycles':\n result = await linearGraphQL(`query ListCycles($first: Int) { cycles(first: $first) { nodes { id name startsAt endsAt } } }`, { first: a.first || 10 });\n break;\n case 'create_comment':\n result = await linearGraphQL(`mutation CreateComment($input: CommentCreateInput!) { commentCreate(input: $input) { success comment { id body } } }`, { input: { issueId: a.issueId, body: a.body } });\n break;\n case 'search_issues':\n result = await linearGraphQL(`query SearchIssues($query: String!, $first: Int) { searchIssues(query: $query, first: $first) { nodes { id identifier title } } }`, { query: a.query, first: a.first || 20 });\n 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"
29
+ },
30
+ "configs": {
31
+ "claude": { "mcpServers": { "linear": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "LINEAR_API_KEY": "${LINEAR_API_KEY}" } } } },
32
+ "cursor": { "mcpServers": { "linear": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "LINEAR_API_KEY": "${LINEAR_API_KEY}" } } } },
33
+ "vscode": { "mcpServers": { "linear": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "LINEAR_API_KEY": "${LINEAR_API_KEY}" } } } }
34
+ },
35
+ "quality": { "overall": 89, "schemaCompleteness": 90, "documentation": 88, "examples": 87, "authHandling": 92, "parameterTypes": 88 },
36
+ "auth": [{ "type": "apiKey", "name": "Authorization", "in": "header", "envVar": "LINEAR_API_KEY", "instructions": "Create an API key at https://linear.app/settings/api" }],
37
+ "docsUrl": "https://developers.linear.app",
38
+ "apiDocsUrl": "https://developers.linear.app/docs/graphql/working-with-the-graphql-api",
39
+ "iconUrl": "https://linear.app/favicon.ico",
40
+ "verified": true,
41
+ "author": "github-to-mcp"
42
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "id": "notion-mcp",
3
+ "name": "Notion",
4
+ "description": "Notion API - manage pages, databases, blocks, and workspaces",
5
+ "sourceRepo": "makenotion/notion-sdk-js",
6
+ "sourceUrl": "https://github.com/makenotion/notion-sdk-js",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v2.2.0",
9
+ "toolCount": 10,
10
+ "tools": [
11
+ { "name": "get_page", "description": "Get a page by ID", "source": "openapi", "paramCount": 1, "requiresAuth": true },
12
+ { "name": "create_page", "description": "Create a new page", "source": "openapi", "paramCount": 3, "requiresAuth": true },
13
+ { "name": "update_page", "description": "Update page properties", "source": "openapi", "paramCount": 2, "requiresAuth": true },
14
+ { "name": "query_database", "description": "Query a database with filters", "source": "openapi", "paramCount": 4, "requiresAuth": true },
15
+ { "name": "create_database", "description": "Create a new database", "source": "openapi", "paramCount": 3, "requiresAuth": true },
16
+ { "name": "get_block", "description": "Get a block by ID", "source": "openapi", "paramCount": 1, "requiresAuth": true },
17
+ { "name": "get_block_children", "description": "Get children of a block", "source": "openapi", "paramCount": 2, "requiresAuth": true },
18
+ { "name": "append_block_children", "description": "Append children to a block", "source": "openapi", "paramCount": 2, "requiresAuth": true },
19
+ { "name": "search", "description": "Search pages and databases", "source": "openapi", "paramCount": 3, "requiresAuth": true },
20
+ { "name": "get_user", "description": "Get user information", "source": "openapi", "paramCount": 1, "requiresAuth": true }
21
+ ],
22
+ "categories": ["productivity", "documentation", "api"],
23
+ "tags": ["notion", "notes", "wiki", "database", "workspace"],
24
+ "popularity": 12840,
25
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
26
+ "createdAt": "2025-06-01T00:00:00.000Z",
27
+ "generatedCode": {
28
+ "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 NOTION_TOKEN = process.env.NOTION_TOKEN;\nconst NOTION_BASE_URL = 'https://api.notion.com/v1';\n\nif (!NOTION_TOKEN) {\n console.error('Error: NOTION_TOKEN environment variable is required');\n process.exit(1);\n}\n\nconst server = new Server({ name: 'notion-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });\n\nasync function notionRequest(endpoint: string, method: string = 'GET', body?: unknown) {\n const response = await fetch(`${NOTION_BASE_URL}${endpoint}`, {\n method,\n headers: {\n 'Authorization': `Bearer ${NOTION_TOKEN}`,\n 'Notion-Version': '2022-06-28',\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 || 'Notion API error');\n }\n return response.json();\n}\n\nconst tools = [\n { name: 'get_page', description: 'Get a page by ID', inputSchema: { type: 'object', properties: { page_id: { type: 'string' } }, required: ['page_id'] } },\n { name: 'create_page', description: 'Create a new page', inputSchema: { type: 'object', properties: { parent: { type: 'object' }, properties: { type: 'object' }, children: { type: 'array' } }, required: ['parent', 'properties'] } },\n { name: 'update_page', description: 'Update page properties', inputSchema: { type: 'object', properties: { page_id: { type: 'string' }, properties: { type: 'object' } }, required: ['page_id', 'properties'] } },\n { name: 'query_database', description: 'Query a database', inputSchema: { type: 'object', properties: { database_id: { type: 'string' }, filter: { type: 'object' }, sorts: { type: 'array' }, page_size: { type: 'number' } }, required: ['database_id'] } },\n { name: 'get_block', description: 'Get a block by ID', inputSchema: { type: 'object', properties: { block_id: { type: 'string' } }, required: ['block_id'] } },\n { name: 'get_block_children', description: 'Get block children', inputSchema: { type: 'object', properties: { block_id: { type: 'string' }, page_size: { type: 'number' } }, required: ['block_id'] } },\n { name: 'append_block_children', description: 'Append children to a block', inputSchema: { type: 'object', properties: { block_id: { type: 'string' }, children: { type: 'array' } }, required: ['block_id', 'children'] } },\n { name: 'search', description: 'Search pages and databases', inputSchema: { type: 'object', properties: { query: { type: 'string' }, filter: { type: 'object' }, page_size: { type: 'number' } } } },\n { name: 'get_user', description: 'Get user information', inputSchema: { type: 'object', properties: { user_id: { type: 'string' } }, required: ['user_id'] } },\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_page': result = await notionRequest(`/pages/${a.page_id}`); break;\n case 'create_page': result = await notionRequest('/pages', 'POST', a); break;\n case 'update_page': result = await notionRequest(`/pages/${a.page_id}`, 'PATCH', { properties: a.properties }); break;\n case 'query_database': result = await notionRequest(`/databases/${a.database_id}/query`, 'POST', { filter: a.filter, sorts: a.sorts, page_size: a.page_size }); break;\n case 'get_block': result = await notionRequest(`/blocks/${a.block_id}`); break;\n case 'get_block_children': result = await notionRequest(`/blocks/${a.block_id}/children?page_size=${a.page_size || 100}`); break;\n case 'append_block_children': result = await notionRequest(`/blocks/${a.block_id}/children`, 'PATCH', { children: a.children }); break;\n case 'search': result = await notionRequest('/search', 'POST', { query: a.query, filter: a.filter, page_size: a.page_size }); break;\n case 'get_user': result = await notionRequest(`/users/${a.user_id}`); 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"
29
+ },
30
+ "configs": {
31
+ "claude": { "mcpServers": { "notion": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "NOTION_TOKEN": "${NOTION_TOKEN}" } } } },
32
+ "cursor": { "mcpServers": { "notion": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "NOTION_TOKEN": "${NOTION_TOKEN}" } } } },
33
+ "vscode": { "mcpServers": { "notion": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "NOTION_TOKEN": "${NOTION_TOKEN}" } } } }
34
+ },
35
+ "quality": { "overall": 88, "schemaCompleteness": 90, "documentation": 85, "examples": 85, "authHandling": 92, "parameterTypes": 88 },
36
+ "auth": [{ "type": "http", "scheme": "bearer", "envVar": "NOTION_TOKEN", "instructions": "Create an integration at https://www.notion.so/my-integrations" }],
37
+ "docsUrl": "https://developers.notion.com",
38
+ "apiDocsUrl": "https://developers.notion.com/reference",
39
+ "iconUrl": "https://www.notion.so/favicon.ico",
40
+ "verified": true,
41
+ "author": "github-to-mcp"
42
+ }
@@ -0,0 +1,40 @@
1
+ {
2
+ "id": "openai-mcp",
3
+ "name": "OpenAI",
4
+ "description": "OpenAI API - chat completions, embeddings, images, and more",
5
+ "sourceRepo": "openai/openai-node",
6
+ "sourceUrl": "https://github.com/openai/openai-node",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v4.0.0",
9
+ "toolCount": 8,
10
+ "tools": [
11
+ { "name": "create_chat_completion", "description": "Generate chat completions", "source": "openapi", "paramCount": 6, "requiresAuth": true },
12
+ { "name": "create_embedding", "description": "Create embeddings for text", "source": "openapi", "paramCount": 3, "requiresAuth": true },
13
+ { "name": "create_image", "description": "Generate images with DALL-E", "source": "openapi", "paramCount": 5, "requiresAuth": true },
14
+ { "name": "list_models", "description": "List available models", "source": "openapi", "paramCount": 0, "requiresAuth": true },
15
+ { "name": "create_transcription", "description": "Transcribe audio with Whisper", "source": "openapi", "paramCount": 4, "requiresAuth": true },
16
+ { "name": "create_moderation", "description": "Check content for policy violations", "source": "openapi", "paramCount": 2, "requiresAuth": true },
17
+ { "name": "create_speech", "description": "Generate speech from text", "source": "openapi", "paramCount": 4, "requiresAuth": true },
18
+ { "name": "list_files", "description": "List uploaded files", "source": "openapi", "paramCount": 1, "requiresAuth": true }
19
+ ],
20
+ "categories": ["ai", "machine-learning", "api"],
21
+ "tags": ["openai", "gpt", "chatgpt", "dalle", "whisper", "embeddings"],
22
+ "popularity": 18920,
23
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
24
+ "createdAt": "2025-06-01T00:00:00.000Z",
25
+ "generatedCode": {
26
+ "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 OPENAI_API_KEY = process.env.OPENAI_API_KEY;\nconst OPENAI_BASE_URL = 'https://api.openai.com/v1';\n\nif (!OPENAI_API_KEY) {\n console.error('Error: OPENAI_API_KEY environment variable is required');\n process.exit(1);\n}\n\nconst server = new Server({ name: 'openai-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });\n\nasync function openaiRequest(endpoint: string, method: string = 'GET', body?: unknown) {\n const response = await fetch(`${OPENAI_BASE_URL}${endpoint}`, {\n method,\n headers: {\n 'Authorization': `Bearer ${OPENAI_API_KEY}`,\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.error?.message || 'OpenAI API error');\n }\n return response.json();\n}\n\nconst tools = [\n { name: 'create_chat_completion', description: 'Generate chat completions', inputSchema: { type: 'object', properties: { model: { type: 'string', description: 'Model ID (e.g., gpt-4)' }, messages: { type: 'array', items: { type: 'object', properties: { role: { type: 'string' }, content: { type: 'string' } } } }, temperature: { type: 'number' }, max_tokens: { type: 'number' }, stream: { type: 'boolean' } }, required: ['model', 'messages'] } },\n { name: 'create_embedding', description: 'Create embeddings', inputSchema: { type: 'object', properties: { model: { type: 'string' }, input: { type: 'string' }, encoding_format: { type: 'string' } }, required: ['model', 'input'] } },\n { name: 'create_image', description: 'Generate images', inputSchema: { type: 'object', properties: { prompt: { type: 'string' }, model: { type: 'string' }, n: { type: 'number' }, size: { type: 'string' }, quality: { type: 'string' } }, required: ['prompt'] } },\n { name: 'list_models', description: 'List available models', inputSchema: { type: 'object', properties: {} } },\n { name: 'create_transcription', description: 'Transcribe audio', inputSchema: { type: 'object', properties: { file: { type: 'string', description: 'Base64 encoded audio file' }, model: { type: 'string' }, language: { type: 'string' }, response_format: { type: 'string' } }, required: ['file', 'model'] } },\n { name: 'create_moderation', description: 'Check content moderation', inputSchema: { type: 'object', properties: { input: { type: 'string' }, model: { type: 'string' } }, required: ['input'] } },\n { name: 'create_speech', description: 'Generate speech', inputSchema: { type: 'object', properties: { model: { type: 'string' }, input: { type: 'string' }, voice: { type: 'string' }, response_format: { type: 'string' } }, required: ['model', 'input', 'voice'] } },\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 'create_chat_completion': result = await openaiRequest('/chat/completions', 'POST', a); break;\n case 'create_embedding': result = await openaiRequest('/embeddings', 'POST', a); break;\n case 'create_image': result = await openaiRequest('/images/generations', 'POST', a); break;\n case 'list_models': result = await openaiRequest('/models'); break;\n case 'create_moderation': result = await openaiRequest('/moderations', 'POST', a); break;\n case 'create_speech': result = await openaiRequest('/audio/speech', 'POST', a); 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"
27
+ },
28
+ "configs": {
29
+ "claude": { "mcpServers": { "openai": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "OPENAI_API_KEY": "${OPENAI_API_KEY}" } } } },
30
+ "cursor": { "mcpServers": { "openai": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "OPENAI_API_KEY": "${OPENAI_API_KEY}" } } } },
31
+ "vscode": { "mcpServers": { "openai": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "OPENAI_API_KEY": "${OPENAI_API_KEY}" } } } }
32
+ },
33
+ "quality": { "overall": 90, "schemaCompleteness": 92, "documentation": 88, "examples": 90, "authHandling": 92, "parameterTypes": 88 },
34
+ "auth": [{ "type": "http", "scheme": "bearer", "envVar": "OPENAI_API_KEY", "instructions": "Get your API key from https://platform.openai.com/api-keys" }],
35
+ "docsUrl": "https://platform.openai.com/docs",
36
+ "apiDocsUrl": "https://platform.openai.com/docs/api-reference",
37
+ "iconUrl": "https://openai.com/favicon.ico",
38
+ "verified": true,
39
+ "author": "github-to-mcp"
40
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "id": "resend-mcp",
3
+ "name": "Resend",
4
+ "description": "Resend API - send transactional emails with modern APIs",
5
+ "sourceRepo": "resend/resend-node",
6
+ "sourceUrl": "https://github.com/resend/resend-node",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v3.0.0",
9
+ "toolCount": 6,
10
+ "tools": [
11
+ { "name": "send_email", "description": "Send an email", "source": "openapi", "paramCount": 7, "requiresAuth": true },
12
+ { "name": "get_email", "description": "Get email details", "source": "openapi", "paramCount": 1, "requiresAuth": true },
13
+ { "name": "list_emails", "description": "List sent emails", "source": "openapi", "paramCount": 2, "requiresAuth": true },
14
+ { "name": "create_domain", "description": "Add a domain for sending", "source": "openapi", "paramCount": 2, "requiresAuth": true },
15
+ { "name": "list_domains", "description": "List all domains", "source": "openapi", "paramCount": 0, "requiresAuth": true },
16
+ { "name": "verify_domain", "description": "Verify domain DNS", "source": "openapi", "paramCount": 1, "requiresAuth": true }
17
+ ],
18
+ "categories": ["email", "communication", "api"],
19
+ "tags": ["resend", "email", "transactional", "smtp", "messaging"],
20
+ "popularity": 5840,
21
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
22
+ "createdAt": "2025-06-01T00:00:00.000Z",
23
+ "generatedCode": {
24
+ "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 RESEND_API_KEY = process.env.RESEND_API_KEY;\nconst RESEND_BASE_URL = 'https://api.resend.com';\n\nif (!RESEND_API_KEY) {\n console.error('Error: RESEND_API_KEY environment variable is required');\n process.exit(1);\n}\n\nconst server = new Server({ name: 'resend-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });\n\nasync function resendRequest(endpoint: string, method: string = 'GET', body?: unknown) {\n const response = await fetch(`${RESEND_BASE_URL}${endpoint}`, {\n method,\n headers: {\n 'Authorization': `Bearer ${RESEND_API_KEY}`,\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 || 'Resend API error');\n }\n return response.json();\n}\n\nconst tools = [\n { name: 'send_email', description: 'Send an email', inputSchema: { type: 'object', properties: { from: { type: 'string', description: 'Sender email' }, to: { type: 'array', items: { type: 'string' }, description: 'Recipients' }, subject: { type: 'string' }, html: { type: 'string', description: 'HTML body' }, text: { type: 'string', description: 'Plain text body' }, cc: { type: 'array', items: { type: 'string' } }, bcc: { type: 'array', items: { type: 'string' } } }, required: ['from', 'to', 'subject'] } },\n { name: 'get_email', description: 'Get email details', inputSchema: { type: 'object', properties: { email_id: { type: 'string' } }, required: ['email_id'] } },\n { name: 'list_emails', description: 'List sent emails', inputSchema: { type: 'object', properties: { limit: { type: 'number' }, cursor: { type: 'string' } } } },\n { name: 'create_domain', description: 'Add a domain', inputSchema: { type: 'object', properties: { name: { type: 'string' }, region: { type: 'string', enum: ['us-east-1', 'eu-west-1', 'sa-east-1'] } }, required: ['name'] } },\n { name: 'list_domains', description: 'List domains', inputSchema: { type: 'object', properties: {} } },\n { name: 'verify_domain', description: 'Verify domain', inputSchema: { type: 'object', properties: { domain_id: { type: 'string' } }, required: ['domain_id'] } },\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 'send_email': result = await resendRequest('/emails', 'POST', a); break;\n case 'get_email': result = await resendRequest(`/emails/${a.email_id}`); break;\n case 'list_emails': result = await resendRequest('/emails'); break;\n case 'create_domain': result = await resendRequest('/domains', 'POST', a); break;\n case 'list_domains': result = await resendRequest('/domains'); break;\n case 'verify_domain': result = await resendRequest(`/domains/${a.domain_id}/verify`, 'POST'); 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"
25
+ },
26
+ "configs": {
27
+ "claude": { "mcpServers": { "resend": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "RESEND_API_KEY": "${RESEND_API_KEY}" } } } },
28
+ "cursor": { "mcpServers": { "resend": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "RESEND_API_KEY": "${RESEND_API_KEY}" } } } },
29
+ "vscode": { "mcpServers": { "resend": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "RESEND_API_KEY": "${RESEND_API_KEY}" } } } }
30
+ },
31
+ "quality": { "overall": 88, "schemaCompleteness": 90, "documentation": 86, "examples": 88, "authHandling": 90, "parameterTypes": 86 },
32
+ "auth": [{ "type": "http", "scheme": "bearer", "envVar": "RESEND_API_KEY", "instructions": "Get your API key from https://resend.com/api-keys" }],
33
+ "docsUrl": "https://resend.com/docs",
34
+ "apiDocsUrl": "https://resend.com/docs/api-reference",
35
+ "iconUrl": "https://resend.com/favicon.ico",
36
+ "verified": true,
37
+ "author": "github-to-mcp"
38
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "id": "slack-mcp",
3
+ "name": "Slack",
4
+ "description": "Slack API - send messages, manage channels, and interact with workspaces",
5
+ "sourceRepo": "slackapi/node-slack-sdk",
6
+ "sourceUrl": "https://github.com/slackapi/node-slack-sdk",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v7.0.0",
9
+ "toolCount": 10,
10
+ "tools": [
11
+ { "name": "post_message", "description": "Send a message to a channel", "source": "openapi", "paramCount": 4, "requiresAuth": true },
12
+ { "name": "list_channels", "description": "List all channels", "source": "openapi", "paramCount": 3, "requiresAuth": true },
13
+ { "name": "get_channel_info", "description": "Get channel information", "source": "openapi", "paramCount": 1, "requiresAuth": true },
14
+ { "name": "create_channel", "description": "Create a new channel", "source": "openapi", "paramCount": 2, "requiresAuth": true },
15
+ { "name": "list_users", "description": "List all users in workspace", "source": "openapi", "paramCount": 2, "requiresAuth": true },
16
+ { "name": "get_user_info", "description": "Get user information", "source": "openapi", "paramCount": 1, "requiresAuth": true },
17
+ { "name": "upload_file", "description": "Upload a file to Slack", "source": "openapi", "paramCount": 4, "requiresAuth": true },
18
+ { "name": "add_reaction", "description": "Add a reaction to a message", "source": "openapi", "paramCount": 3, "requiresAuth": true },
19
+ { "name": "get_conversation_history", "description": "Get message history", "source": "openapi", "paramCount": 4, "requiresAuth": true },
20
+ { "name": "search_messages", "description": "Search for messages", "source": "openapi", "paramCount": 3, "requiresAuth": true }
21
+ ],
22
+ "categories": ["communication", "collaboration", "api"],
23
+ "tags": ["slack", "messaging", "chat", "team", "workspace"],
24
+ "popularity": 11250,
25
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
26
+ "createdAt": "2025-06-01T00:00:00.000Z",
27
+ "generatedCode": {
28
+ "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 SLACK_TOKEN = process.env.SLACK_TOKEN;\nconst SLACK_BASE_URL = 'https://slack.com/api';\n\nif (!SLACK_TOKEN) {\n console.error('Error: SLACK_TOKEN environment variable is required');\n process.exit(1);\n}\n\nconst server = new Server({ name: 'slack-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });\n\nasync function slackRequest(method: string, params: Record<string, unknown> = {}) {\n const response = await fetch(`${SLACK_BASE_URL}/${method}`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${SLACK_TOKEN}`,\n 'Content-Type': 'application/json; charset=utf-8',\n },\n body: JSON.stringify(params),\n });\n const result = await response.json();\n if (!result.ok) throw new Error(result.error || 'Slack API error');\n return result;\n}\n\nconst tools = [\n { name: 'post_message', description: 'Send a message to a channel', inputSchema: { type: 'object', properties: { channel: { type: 'string' }, text: { type: 'string' }, blocks: { type: 'array' }, thread_ts: { type: 'string' } }, required: ['channel', 'text'] } },\n { name: 'list_channels', description: 'List all channels', inputSchema: { type: 'object', properties: { types: { type: 'string' }, limit: { type: 'number' }, cursor: { type: 'string' } } } },\n { name: 'get_channel_info', description: 'Get channel information', inputSchema: { type: 'object', properties: { channel: { type: 'string' } }, required: ['channel'] } },\n { name: 'create_channel', description: 'Create a new channel', inputSchema: { type: 'object', properties: { name: { type: 'string' }, is_private: { type: 'boolean' } }, required: ['name'] } },\n { name: 'list_users', description: 'List all users', inputSchema: { type: 'object', properties: { limit: { type: 'number' }, cursor: { type: 'string' } } } },\n { name: 'get_user_info', description: 'Get user information', inputSchema: { type: 'object', properties: { user: { type: 'string' } }, required: ['user'] } },\n { name: 'add_reaction', description: 'Add a reaction', inputSchema: { type: 'object', properties: { channel: { type: 'string' }, timestamp: { type: 'string' }, name: { type: 'string' } }, required: ['channel', 'timestamp', 'name'] } },\n { name: 'get_conversation_history', description: 'Get message history', inputSchema: { type: 'object', properties: { channel: { type: 'string' }, limit: { type: 'number' }, oldest: { type: 'string' }, latest: { type: 'string' } }, required: ['channel'] } },\n { name: 'search_messages', description: 'Search for messages', inputSchema: { type: 'object', properties: { query: { type: 'string' }, count: { type: 'number' }, sort: { type: 'string' } }, required: ['query'] } },\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 'post_message': result = await slackRequest('chat.postMessage', a); break;\n case 'list_channels': result = await slackRequest('conversations.list', a); break;\n case 'get_channel_info': result = await slackRequest('conversations.info', a); break;\n case 'create_channel': result = await slackRequest('conversations.create', a); break;\n case 'list_users': result = await slackRequest('users.list', a); break;\n case 'get_user_info': result = await slackRequest('users.info', a); break;\n case 'add_reaction': result = await slackRequest('reactions.add', a); break;\n case 'get_conversation_history': result = await slackRequest('conversations.history', a); break;\n case 'search_messages': result = await slackRequest('search.messages', a); 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"
29
+ },
30
+ "configs": {
31
+ "claude": { "mcpServers": { "slack": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "SLACK_TOKEN": "${SLACK_TOKEN}" } } } },
32
+ "cursor": { "mcpServers": { "slack": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "SLACK_TOKEN": "${SLACK_TOKEN}" } } } },
33
+ "vscode": { "mcpServers": { "slack": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "SLACK_TOKEN": "${SLACK_TOKEN}" } } } }
34
+ },
35
+ "quality": { "overall": 86, "schemaCompleteness": 88, "documentation": 85, "examples": 82, "authHandling": 90, "parameterTypes": 85 },
36
+ "auth": [{ "type": "http", "scheme": "bearer", "envVar": "SLACK_TOKEN", "instructions": "Create a Slack app at https://api.slack.com/apps and get a bot token" }],
37
+ "docsUrl": "https://api.slack.com/docs",
38
+ "apiDocsUrl": "https://api.slack.com/methods",
39
+ "iconUrl": "https://slack.com/favicon.ico",
40
+ "verified": true,
41
+ "author": "github-to-mcp"
42
+ }
@@ -0,0 +1,163 @@
1
+ {
2
+ "id": "stripe-mcp",
3
+ "name": "Stripe",
4
+ "description": "Payment processing API - create customers, charges, subscriptions, and more",
5
+ "sourceRepo": "stripe/stripe-node",
6
+ "sourceUrl": "https://github.com/stripe/stripe-node",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v14.0.0",
9
+ "toolCount": 12,
10
+ "tools": [
11
+ {
12
+ "name": "create_customer",
13
+ "description": "Create a new Stripe customer",
14
+ "source": "openapi",
15
+ "paramCount": 4,
16
+ "requiresAuth": true
17
+ },
18
+ {
19
+ "name": "get_customer",
20
+ "description": "Retrieve a customer by ID",
21
+ "source": "openapi",
22
+ "paramCount": 1,
23
+ "requiresAuth": true
24
+ },
25
+ {
26
+ "name": "list_customers",
27
+ "description": "List all customers with pagination",
28
+ "source": "openapi",
29
+ "paramCount": 3,
30
+ "requiresAuth": true
31
+ },
32
+ {
33
+ "name": "create_payment_intent",
34
+ "description": "Create a payment intent for processing payments",
35
+ "source": "openapi",
36
+ "paramCount": 5,
37
+ "requiresAuth": true
38
+ },
39
+ {
40
+ "name": "confirm_payment_intent",
41
+ "description": "Confirm a payment intent",
42
+ "source": "openapi",
43
+ "paramCount": 2,
44
+ "requiresAuth": true
45
+ },
46
+ {
47
+ "name": "create_subscription",
48
+ "description": "Create a subscription for a customer",
49
+ "source": "openapi",
50
+ "paramCount": 4,
51
+ "requiresAuth": true
52
+ },
53
+ {
54
+ "name": "cancel_subscription",
55
+ "description": "Cancel an existing subscription",
56
+ "source": "openapi",
57
+ "paramCount": 2,
58
+ "requiresAuth": true
59
+ },
60
+ {
61
+ "name": "create_invoice",
62
+ "description": "Create an invoice for a customer",
63
+ "source": "openapi",
64
+ "paramCount": 3,
65
+ "requiresAuth": true
66
+ },
67
+ {
68
+ "name": "list_invoices",
69
+ "description": "List all invoices with filtering",
70
+ "source": "openapi",
71
+ "paramCount": 4,
72
+ "requiresAuth": true
73
+ },
74
+ {
75
+ "name": "create_refund",
76
+ "description": "Create a refund for a charge or payment intent",
77
+ "source": "openapi",
78
+ "paramCount": 3,
79
+ "requiresAuth": true
80
+ },
81
+ {
82
+ "name": "get_balance",
83
+ "description": "Retrieve current account balance",
84
+ "source": "openapi",
85
+ "paramCount": 0,
86
+ "requiresAuth": true
87
+ },
88
+ {
89
+ "name": "list_products",
90
+ "description": "List all products",
91
+ "source": "openapi",
92
+ "paramCount": 3,
93
+ "requiresAuth": true
94
+ }
95
+ ],
96
+ "categories": ["payments", "fintech", "api"],
97
+ "tags": ["stripe", "payments", "billing", "subscriptions", "invoices"],
98
+ "popularity": 15420,
99
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
100
+ "createdAt": "2025-06-01T00:00:00.000Z",
101
+ "generatedCode": {
102
+ "typescript": "import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\n\nconst STRIPE_API_KEY = process.env.STRIPE_API_KEY;\nconst STRIPE_BASE_URL = 'https://api.stripe.com/v1';\n\nif (!STRIPE_API_KEY) {\n console.error('Error: STRIPE_API_KEY environment variable is required');\n process.exit(1);\n}\n\nconst server = new Server(\n { name: 'stripe-mcp', version: '1.0.0' },\n { capabilities: { tools: {} } }\n);\n\nasync function stripeRequest(endpoint: string, method: string = 'GET', body?: Record<string, unknown>) {\n const response = await fetch(`${STRIPE_BASE_URL}${endpoint}`, {\n method,\n headers: {\n 'Authorization': `Bearer ${STRIPE_API_KEY}`,\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body ? new URLSearchParams(body as Record<string, string>).toString() : undefined,\n });\n \n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error?.message || 'Stripe API error');\n }\n \n return response.json();\n}\n\nconst tools = [\n {\n name: 'create_customer',\n description: 'Create a new Stripe customer',\n inputSchema: {\n type: 'object',\n properties: {\n email: { type: 'string', description: 'Customer email address' },\n name: { type: 'string', description: 'Customer name' },\n phone: { type: 'string', description: 'Customer phone number' },\n metadata: { type: 'object', description: 'Additional metadata' },\n },\n required: ['email'],\n },\n },\n {\n name: 'get_customer',\n description: 'Retrieve a customer by ID',\n inputSchema: {\n type: 'object',\n properties: {\n customer_id: { type: 'string', description: 'Customer ID (cus_xxx)' },\n },\n required: ['customer_id'],\n },\n },\n {\n name: 'list_customers',\n description: 'List all customers with pagination',\n inputSchema: {\n type: 'object',\n properties: {\n limit: { type: 'number', description: 'Number of customers to return (max 100)' },\n starting_after: { type: 'string', description: 'Cursor for pagination' },\n email: { type: 'string', description: 'Filter by email' },\n },\n },\n },\n {\n name: 'create_payment_intent',\n description: 'Create a payment intent for processing payments',\n inputSchema: {\n type: 'object',\n properties: {\n amount: { type: 'number', description: 'Amount in cents' },\n currency: { type: 'string', description: 'Three-letter currency code (e.g., usd)' },\n customer: { type: 'string', description: 'Customer ID' },\n description: { type: 'string', description: 'Payment description' },\n metadata: { type: 'object', description: 'Additional metadata' },\n },\n required: ['amount', 'currency'],\n },\n },\n {\n name: 'confirm_payment_intent',\n description: 'Confirm a payment intent',\n inputSchema: {\n type: 'object',\n properties: {\n payment_intent_id: { type: 'string', description: 'Payment intent ID' },\n payment_method: { type: 'string', description: 'Payment method ID' },\n },\n required: ['payment_intent_id'],\n },\n },\n {\n name: 'create_subscription',\n description: 'Create a subscription for a customer',\n inputSchema: {\n type: 'object',\n properties: {\n customer: { type: 'string', description: 'Customer ID' },\n price: { type: 'string', description: 'Price ID' },\n trial_period_days: { type: 'number', description: 'Number of trial days' },\n metadata: { type: 'object', description: 'Additional metadata' },\n },\n required: ['customer', 'price'],\n },\n },\n {\n name: 'cancel_subscription',\n description: 'Cancel an existing subscription',\n inputSchema: {\n type: 'object',\n properties: {\n subscription_id: { type: 'string', description: 'Subscription ID' },\n cancel_at_period_end: { type: 'boolean', description: 'Cancel at end of period' },\n },\n required: ['subscription_id'],\n },\n },\n {\n name: 'create_invoice',\n description: 'Create an invoice for a customer',\n inputSchema: {\n type: 'object',\n properties: {\n customer: { type: 'string', description: 'Customer ID' },\n auto_advance: { type: 'boolean', description: 'Auto-finalize invoice' },\n description: { type: 'string', description: 'Invoice description' },\n },\n required: ['customer'],\n },\n },\n {\n name: 'list_invoices',\n description: 'List all invoices with filtering',\n inputSchema: {\n type: 'object',\n properties: {\n customer: { type: 'string', description: 'Filter by customer ID' },\n status: { type: 'string', enum: ['draft', 'open', 'paid', 'void', 'uncollectible'] },\n limit: { type: 'number', description: 'Number of invoices to return' },\n starting_after: { type: 'string', description: 'Cursor for pagination' },\n },\n },\n },\n {\n name: 'create_refund',\n description: 'Create a refund for a charge or payment intent',\n inputSchema: {\n type: 'object',\n properties: {\n payment_intent: { type: 'string', description: 'Payment intent ID to refund' },\n amount: { type: 'number', description: 'Amount to refund in cents (partial refund)' },\n reason: { type: 'string', enum: ['duplicate', 'fraudulent', 'requested_by_customer'] },\n },\n required: ['payment_intent'],\n },\n },\n {\n name: 'get_balance',\n description: 'Retrieve current account balance',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n {\n name: 'list_products',\n description: 'List all products',\n inputSchema: {\n type: 'object',\n properties: {\n active: { type: 'boolean', description: 'Filter by active status' },\n limit: { type: 'number', description: 'Number of products to return' },\n starting_after: { type: 'string', description: 'Cursor for pagination' },\n },\n },\n },\n];\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n \n try {\n let result;\n \n switch (name) {\n case 'create_customer':\n result = await stripeRequest('/customers', 'POST', args as Record<string, unknown>);\n break;\n case 'get_customer':\n result = await stripeRequest(`/customers/${(args as { customer_id: string }).customer_id}`);\n break;\n case 'list_customers':\n const customerParams = new URLSearchParams(args as Record<string, string>).toString();\n result = await stripeRequest(`/customers?${customerParams}`);\n break;\n case 'create_payment_intent':\n result = await stripeRequest('/payment_intents', 'POST', args as Record<string, unknown>);\n break;\n case 'confirm_payment_intent':\n const { payment_intent_id, ...confirmArgs } = args as { payment_intent_id: string };\n result = await stripeRequest(`/payment_intents/${payment_intent_id}/confirm`, 'POST', confirmArgs);\n break;\n case 'create_subscription':\n result = await stripeRequest('/subscriptions', 'POST', { ...args as Record<string, unknown>, items: [{ price: (args as { price: string }).price }] });\n break;\n case 'cancel_subscription':\n const { subscription_id, ...cancelArgs } = args as { subscription_id: string };\n result = await stripeRequest(`/subscriptions/${subscription_id}`, 'DELETE', cancelArgs);\n break;\n case 'create_invoice':\n result = await stripeRequest('/invoices', 'POST', args as Record<string, unknown>);\n break;\n case 'list_invoices':\n const invoiceParams = new URLSearchParams(args as Record<string, string>).toString();\n result = await stripeRequest(`/invoices?${invoiceParams}`);\n break;\n case 'create_refund':\n result = await stripeRequest('/refunds', 'POST', args as Record<string, unknown>);\n break;\n case 'get_balance':\n result = await stripeRequest('/balance');\n break;\n case 'list_products':\n const productParams = new URLSearchParams(args as Record<string, string>).toString();\n result = await stripeRequest(`/products?${productParams}`);\n break;\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\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 console.error('Stripe MCP server running on stdio');\n}\n\nmain().catch(console.error);\n",
103
+ "python": "#!/usr/bin/env python3\n\"\"\"Stripe MCP Server - Payment processing tools\"\"\"\n\nimport os\nimport json\nimport httpx\nfrom mcp.server import Server\nfrom mcp.server.stdio import stdio_server\nfrom mcp.types import Tool, TextContent\n\nSTRIPE_API_KEY = os.environ.get('STRIPE_API_KEY')\nSTRIPE_BASE_URL = 'https://api.stripe.com/v1'\n\nif not STRIPE_API_KEY:\n raise ValueError('STRIPE_API_KEY environment variable is required')\n\nserver = Server('stripe-mcp')\n\nasync def stripe_request(endpoint: str, method: str = 'GET', data: dict = None):\n async with httpx.AsyncClient() as client:\n headers = {\n 'Authorization': f'Bearer {STRIPE_API_KEY}',\n 'Content-Type': 'application/x-www-form-urlencoded',\n }\n url = f'{STRIPE_BASE_URL}{endpoint}'\n \n if method == 'GET':\n response = await client.get(url, headers=headers, params=data)\n elif method == 'POST':\n response = await client.post(url, headers=headers, data=data)\n elif method == 'DELETE':\n response = await client.delete(url, headers=headers, data=data)\n \n response.raise_for_status()\n return response.json()\n\n@server.list_tools()\nasync def list_tools():\n return [\n Tool(name='create_customer', description='Create a new Stripe customer',\n inputSchema={'type': 'object', 'properties': {'email': {'type': 'string'}, 'name': {'type': 'string'}}, 'required': ['email']}),\n Tool(name='get_customer', description='Retrieve a customer by ID',\n inputSchema={'type': 'object', 'properties': {'customer_id': {'type': 'string'}}, 'required': ['customer_id']}),\n Tool(name='create_payment_intent', description='Create a payment intent',\n inputSchema={'type': 'object', 'properties': {'amount': {'type': 'number'}, 'currency': {'type': 'string'}}, 'required': ['amount', 'currency']}),\n Tool(name='get_balance', description='Get account balance',\n inputSchema={'type': 'object', 'properties': {}}),\n ]\n\n@server.call_tool()\nasync def call_tool(name: str, arguments: dict):\n try:\n if name == 'create_customer':\n result = await stripe_request('/customers', 'POST', arguments)\n elif name == 'get_customer':\n result = await stripe_request(f\"/customers/{arguments['customer_id']}\")\n elif name == 'create_payment_intent':\n result = await stripe_request('/payment_intents', 'POST', arguments)\n elif name == 'get_balance':\n result = await stripe_request('/balance')\n else:\n raise ValueError(f'Unknown tool: {name}')\n \n return [TextContent(type='text', text=json.dumps(result, indent=2))]\n except Exception as e:\n return [TextContent(type='text', text=f'Error: {str(e)}')]\n\nasync def main():\n async with stdio_server() as (read_stream, write_stream):\n await server.run(read_stream, write_stream, server.create_initialization_options())\n\nif __name__ == '__main__':\n import asyncio\n asyncio.run(main())\n"
104
+ },
105
+ "configs": {
106
+ "claude": {
107
+ "mcpServers": {
108
+ "stripe": {
109
+ "command": "npx",
110
+ "args": ["tsx", "index.ts"],
111
+ "env": {
112
+ "STRIPE_API_KEY": "${STRIPE_API_KEY}"
113
+ }
114
+ }
115
+ }
116
+ },
117
+ "cursor": {
118
+ "mcpServers": {
119
+ "stripe": {
120
+ "command": "npx",
121
+ "args": ["tsx", "index.ts"],
122
+ "env": {
123
+ "STRIPE_API_KEY": "${STRIPE_API_KEY}"
124
+ }
125
+ }
126
+ }
127
+ },
128
+ "vscode": {
129
+ "mcpServers": {
130
+ "stripe": {
131
+ "command": "npx",
132
+ "args": ["tsx", "index.ts"],
133
+ "env": {
134
+ "STRIPE_API_KEY": "${STRIPE_API_KEY}"
135
+ }
136
+ }
137
+ }
138
+ }
139
+ },
140
+ "quality": {
141
+ "overall": 92,
142
+ "schemaCompleteness": 95,
143
+ "documentation": 90,
144
+ "examples": 88,
145
+ "authHandling": 95,
146
+ "parameterTypes": 92
147
+ },
148
+ "auth": [
149
+ {
150
+ "type": "apiKey",
151
+ "name": "Authorization",
152
+ "in": "header",
153
+ "scheme": "bearer",
154
+ "envVar": "STRIPE_API_KEY",
155
+ "instructions": "Get your API key from https://dashboard.stripe.com/apikeys"
156
+ }
157
+ ],
158
+ "docsUrl": "https://stripe.com/docs",
159
+ "apiDocsUrl": "https://stripe.com/docs/api",
160
+ "iconUrl": "https://stripe.com/favicon.ico",
161
+ "verified": true,
162
+ "author": "github-to-mcp"
163
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "id": "supabase-mcp",
3
+ "name": "Supabase",
4
+ "description": "Supabase API - database queries, authentication, storage, and realtime",
5
+ "sourceRepo": "supabase/supabase-js",
6
+ "sourceUrl": "https://github.com/supabase/supabase-js",
7
+ "version": "1.0.0",
8
+ "sourceVersion": "v2.40.0",
9
+ "toolCount": 10,
10
+ "tools": [
11
+ { "name": "query_table", "description": "Query data from a table", "source": "code", "paramCount": 5, "requiresAuth": true },
12
+ { "name": "insert_rows", "description": "Insert rows into a table", "source": "code", "paramCount": 3, "requiresAuth": true },
13
+ { "name": "update_rows", "description": "Update rows in a table", "source": "code", "paramCount": 4, "requiresAuth": true },
14
+ { "name": "delete_rows", "description": "Delete rows from a table", "source": "code", "paramCount": 3, "requiresAuth": true },
15
+ { "name": "run_rpc", "description": "Call a database function", "source": "code", "paramCount": 2, "requiresAuth": true },
16
+ { "name": "upload_file", "description": "Upload a file to storage", "source": "code", "paramCount": 4, "requiresAuth": true },
17
+ { "name": "download_file", "description": "Download a file from storage", "source": "code", "paramCount": 2, "requiresAuth": true },
18
+ { "name": "list_files", "description": "List files in a bucket", "source": "code", "paramCount": 3, "requiresAuth": true },
19
+ { "name": "sign_up", "description": "Sign up a new user", "source": "code", "paramCount": 2, "requiresAuth": false },
20
+ { "name": "sign_in", "description": "Sign in a user", "source": "code", "paramCount": 2, "requiresAuth": false }
21
+ ],
22
+ "categories": ["database", "backend", "api"],
23
+ "tags": ["supabase", "postgres", "database", "auth", "storage", "realtime"],
24
+ "popularity": 14250,
25
+ "lastUpdated": "2026-01-15T00:00:00.000Z",
26
+ "createdAt": "2025-06-01T00:00:00.000Z",
27
+ "generatedCode": {
28
+ "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 SUPABASE_URL = process.env.SUPABASE_URL;\nconst SUPABASE_KEY = process.env.SUPABASE_KEY;\n\nif (!SUPABASE_URL || !SUPABASE_KEY) {\n console.error('Error: SUPABASE_URL and SUPABASE_KEY environment variables are required');\n process.exit(1);\n}\n\nconst server = new Server({ name: 'supabase-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });\n\nasync function supabaseRequest(endpoint: string, method: string = 'GET', body?: unknown, headers?: Record<string, string>) {\n const response = await fetch(`${SUPABASE_URL}${endpoint}`, {\n method,\n headers: {\n 'apikey': SUPABASE_KEY,\n 'Authorization': `Bearer ${SUPABASE_KEY}`,\n 'Content-Type': 'application/json',\n 'Prefer': 'return=representation',\n ...headers,\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 || error.error || 'Supabase API error');\n }\n const text = await response.text();\n return text ? JSON.parse(text) : {};\n}\n\nconst tools = [\n { name: 'query_table', description: 'Query data from a table', inputSchema: { type: 'object', properties: { table: { type: 'string' }, select: { type: 'string' }, filter: { type: 'string' }, order: { type: 'string' }, limit: { type: 'number' } }, required: ['table'] } },\n { name: 'insert_rows', description: 'Insert rows', inputSchema: { type: 'object', properties: { table: { type: 'string' }, data: { type: 'array' }, upsert: { type: 'boolean' } }, required: ['table', 'data'] } },\n { name: 'update_rows', description: 'Update rows', inputSchema: { type: 'object', properties: { table: { type: 'string' }, data: { type: 'object' }, filter: { type: 'string' } }, required: ['table', 'data', 'filter'] } },\n { name: 'delete_rows', description: 'Delete rows', inputSchema: { type: 'object', properties: { table: { type: 'string' }, filter: { type: 'string' } }, required: ['table', 'filter'] } },\n { name: 'run_rpc', description: 'Call a database function', inputSchema: { type: 'object', properties: { function_name: { type: 'string' }, params: { type: 'object' } }, required: ['function_name'] } },\n { name: 'upload_file', description: 'Upload a file', inputSchema: { type: 'object', properties: { bucket: { type: 'string' }, path: { type: 'string' }, file_base64: { type: 'string' }, content_type: { type: 'string' } }, required: ['bucket', 'path', 'file_base64'] } },\n { name: 'list_files', description: 'List files', inputSchema: { type: 'object', properties: { bucket: { type: 'string' }, path: { type: 'string' }, limit: { type: 'number' } }, required: ['bucket'] } },\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 'query_table': {\n let url = `/rest/v1/${a.table}?select=${a.select || '*'}`;\n if (a.filter) url += `&${a.filter}`;\n if (a.order) url += `&order=${a.order}`;\n if (a.limit) url += `&limit=${a.limit}`;\n result = await supabaseRequest(url);\n break;\n }\n case 'insert_rows': result = await supabaseRequest(`/rest/v1/${a.table}`, 'POST', a.data, a.upsert ? { 'Prefer': 'resolution=merge-duplicates,return=representation' } : undefined); break;\n case 'update_rows': result = await supabaseRequest(`/rest/v1/${a.table}?${a.filter}`, 'PATCH', a.data); break;\n case 'delete_rows': result = await supabaseRequest(`/rest/v1/${a.table}?${a.filter}`, 'DELETE'); break;\n case 'run_rpc': result = await supabaseRequest(`/rest/v1/rpc/${a.function_name}`, 'POST', a.params || {}); break;\n case 'list_files': result = await supabaseRequest(`/storage/v1/object/list/${a.bucket}`, 'POST', { prefix: a.path || '', limit: a.limit || 100 }); 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"
29
+ },
30
+ "configs": {
31
+ "claude": { "mcpServers": { "supabase": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "SUPABASE_URL": "${SUPABASE_URL}", "SUPABASE_KEY": "${SUPABASE_KEY}" } } } },
32
+ "cursor": { "mcpServers": { "supabase": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "SUPABASE_URL": "${SUPABASE_URL}", "SUPABASE_KEY": "${SUPABASE_KEY}" } } } },
33
+ "vscode": { "mcpServers": { "supabase": { "command": "npx", "args": ["tsx", "index.ts"], "env": { "SUPABASE_URL": "${SUPABASE_URL}", "SUPABASE_KEY": "${SUPABASE_KEY}" } } } }
34
+ },
35
+ "quality": { "overall": 87, "schemaCompleteness": 88, "documentation": 85, "examples": 86, "authHandling": 90, "parameterTypes": 86 },
36
+ "auth": [{ "type": "apiKey", "name": "apikey", "in": "header", "envVar": "SUPABASE_KEY", "instructions": "Get your API key from your Supabase project settings" }],
37
+ "docsUrl": "https://supabase.com/docs",
38
+ "apiDocsUrl": "https://supabase.com/docs/reference",
39
+ "iconUrl": "https://supabase.com/favicon.ico",
40
+ "verified": true,
41
+ "author": "github-to-mcp"
42
+ }