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.
- package/.env.example +8 -0
- package/.github/CODEOWNERS +6 -0
- package/.husky/pre-commit +1 -0
- package/.nvmrc +1 -0
- package/.prettierignore +5 -0
- package/.prettierrc +7 -0
- package/.vscode/settings.json +4 -0
- package/ARCHITECTURE.md +1429 -0
- package/CHANGELOG.md +167 -0
- package/CONTRIBUTING.md +327 -0
- package/LICENSE +201 -0
- package/README.md +1028 -0
- package/SECURITY.md +248 -0
- package/VISUAL_GUIDE.md +437 -0
- package/apps/vscode/IMPLEMENTATION.md +480 -0
- package/apps/vscode/README.md +248 -0
- package/apps/vscode/package.json +381 -0
- package/apps/vscode/resources/icon.png +0 -0
- package/apps/vscode/resources/icon.svg +5 -0
- package/apps/vscode/src/commands/browseRegistry.ts +211 -0
- package/apps/vscode/src/commands/configureClaudeDesktop.ts +332 -0
- package/apps/vscode/src/commands/convert.ts +82 -0
- package/apps/vscode/src/commands/convertCurrentRepo.ts +109 -0
- package/apps/vscode/src/commands/convertFromUrl.ts +138 -0
- package/apps/vscode/src/commands/index.ts +121 -0
- package/apps/vscode/src/commands/validate.ts +197 -0
- package/apps/vscode/src/extension.ts +464 -0
- package/apps/vscode/src/global.d.ts +36 -0
- package/apps/vscode/src/test/extension.test.ts +73 -0
- package/apps/vscode/src/utils/file-generator.ts +529 -0
- package/apps/vscode/src/utils/github-api.ts +335 -0
- package/apps/vscode/src/utils/index.ts +29 -0
- package/apps/vscode/src/utils/mcp-config.ts +334 -0
- package/apps/vscode/src/utils/storage.ts +87 -0
- package/apps/vscode/src/views/McpServersTreeView.ts +160 -0
- package/apps/vscode/src/views/OutputChannelView.ts +195 -0
- package/apps/vscode/src/views/StatusBarItem.ts +251 -0
- package/apps/vscode/src/views/ToolsExplorerView.ts +314 -0
- package/apps/vscode/src/views/historyProvider.ts +75 -0
- package/apps/vscode/src/views/index.ts +12 -0
- package/apps/vscode/src/views/resultsPanel.ts +330 -0
- package/apps/vscode/src/webviews/ConversionPanel.ts +350 -0
- package/apps/vscode/src/webviews/ToolDetailsPanel.ts +448 -0
- package/apps/vscode/src/webviews/index.ts +9 -0
- package/apps/vscode/src/webviews/webview-ui/styles.ts +492 -0
- package/apps/vscode/tsconfig.json +20 -0
- package/apps/web/PLAYGROUND_GUIDE.md +499 -0
- package/apps/web/README.md +505 -0
- package/apps/web/app/api/convert/route.ts +100 -0
- package/apps/web/app/api/convert/stream/route.ts +198 -0
- package/apps/web/app/api/deploy/route.ts +157 -0
- package/apps/web/app/api/edge/route.ts +308 -0
- package/apps/web/app/api/export-docker/route.ts +284 -0
- package/apps/web/app/api/generate-openapi/route.ts +119 -0
- package/apps/web/app/api/mcp/[serverId]/route.ts +263 -0
- package/apps/web/app/api/playground/connect/route.ts +143 -0
- package/apps/web/app/api/playground/disconnect/route.ts +78 -0
- package/apps/web/app/api/playground/execute/route.ts +135 -0
- package/apps/web/app/api/playground/sessions/route.ts +103 -0
- package/apps/web/app/api/playground/tools/route.ts +117 -0
- package/apps/web/app/api/playground/v2/connect/route.ts +96 -0
- package/apps/web/app/api/playground/v2/disconnect/route.ts +88 -0
- package/apps/web/app/api/playground/v2/health/route.ts +80 -0
- package/apps/web/app/api/playground/v2/prompts/route.ts +160 -0
- package/apps/web/app/api/playground/v2/resources/route.ts +159 -0
- package/apps/web/app/api/playground/v2/sessions/route.ts +184 -0
- package/apps/web/app/api/playground/v2/tools/route.ts +167 -0
- package/apps/web/app/api/stream/route.ts +232 -0
- package/apps/web/app/batch/BatchConvertClient.tsx +190 -0
- package/apps/web/app/batch/page.tsx +37 -0
- package/apps/web/app/convert/page.tsx +269 -0
- package/apps/web/app/dashboard/page.tsx +380 -0
- package/apps/web/app/globals.css +622 -0
- package/apps/web/app/layout.tsx +120 -0
- package/apps/web/app/manifest.ts +31 -0
- package/apps/web/app/opengraph-image.tsx +112 -0
- package/apps/web/app/page.old.tsx +924 -0
- package/apps/web/app/page.tsx +77 -0
- package/apps/web/app/playground/page.tsx +306 -0
- package/apps/web/app/playground/v2/error.tsx +163 -0
- package/apps/web/app/playground/v2/layout.tsx +58 -0
- package/apps/web/app/playground/v2/loading.tsx +152 -0
- package/apps/web/app/playground/v2/page.tsx +644 -0
- package/apps/web/app/playground/v2/providers.tsx +214 -0
- package/apps/web/app/playground/v2/use-shortcuts.ts +209 -0
- package/apps/web/app/playground/v2/use-url-state.ts +296 -0
- package/apps/web/app/providers.tsx +22 -0
- package/apps/web/app/sitemap.ts +32 -0
- package/apps/web/app/twitter-image.tsx +112 -0
- package/apps/web/components/BranchSelector.tsx +401 -0
- package/apps/web/components/ClaudeConfigExport.tsx +226 -0
- package/apps/web/components/Features.tsx +84 -0
- package/apps/web/components/Footer.tsx +119 -0
- package/apps/web/components/GenerationProgress.tsx +248 -0
- package/apps/web/components/GithubUrlInput.tsx +483 -0
- package/apps/web/components/Header.tsx +175 -0
- package/apps/web/components/Hero.tsx +117 -0
- package/apps/web/components/HowItWorks.tsx +119 -0
- package/apps/web/components/InstallBanner.tsx +158 -0
- package/apps/web/components/Logo.tsx +116 -0
- package/apps/web/components/ParticleBackground.tsx +105 -0
- package/apps/web/components/Playground.tsx +472 -0
- package/apps/web/components/PlaygroundToolTester.tsx +410 -0
- package/apps/web/components/ProductCards.tsx +179 -0
- package/apps/web/components/SplitView.tsx +194 -0
- package/apps/web/components/ToolFilter.tsx +260 -0
- package/apps/web/components/ToolList.tsx +325 -0
- package/apps/web/components/batch/BatchConvert.tsx +785 -0
- package/apps/web/components/batch/index.ts +7 -0
- package/apps/web/components/convert/ConfigTabs.tsx +230 -0
- package/apps/web/components/convert/ConversionResult.tsx +482 -0
- package/apps/web/components/convert/InlinePlayground.tsx +259 -0
- package/apps/web/components/convert/LoadingSteps.tsx +311 -0
- package/apps/web/components/convert/OneClickInstall.tsx +224 -0
- package/apps/web/components/convert/ToolCard.tsx +189 -0
- package/apps/web/components/convert/TryInPlayground.tsx +242 -0
- package/apps/web/components/convert/index.ts +12 -0
- package/apps/web/components/deploy/DeployButton.tsx +369 -0
- package/apps/web/components/deploy/index.ts +7 -0
- package/apps/web/components/docker/DockerExport.tsx +690 -0
- package/apps/web/components/docker/index.ts +7 -0
- package/apps/web/components/install/OneClickInstall.tsx +676 -0
- package/apps/web/components/install/index.ts +7 -0
- package/apps/web/components/playground/CapabilityTabs.tsx +150 -0
- package/apps/web/components/playground/ConnectionStatusV2.tsx +322 -0
- package/apps/web/components/playground/EmptyStates.tsx +305 -0
- package/apps/web/components/playground/ExecutionLog.tsx +260 -0
- package/apps/web/components/playground/ExecutionLogV2.tsx +378 -0
- package/apps/web/components/playground/JsonViewer.tsx +388 -0
- package/apps/web/components/playground/PlaygroundLayout.tsx +244 -0
- package/apps/web/components/playground/PromptsPanel.tsx +385 -0
- package/apps/web/components/playground/ResourcesPanel.tsx +378 -0
- package/apps/web/components/playground/SchemaForm.tsx +477 -0
- package/apps/web/components/playground/ServerStatus.tsx +151 -0
- package/apps/web/components/playground/ShareButton.tsx +239 -0
- package/apps/web/components/playground/ToolsPanel.tsx +309 -0
- package/apps/web/components/playground/TransportConfigurator.tsx +563 -0
- package/apps/web/components/playground/index.ts +74 -0
- package/apps/web/components/playground/types.ts +202 -0
- package/apps/web/components/streaming/StreamingProgress.tsx +441 -0
- package/apps/web/components/streaming/index.ts +7 -0
- package/apps/web/components/ui/badge.tsx +42 -0
- package/apps/web/components/ui/button.tsx +88 -0
- package/apps/web/components/ui/card.tsx +75 -0
- package/apps/web/components/ui/code-block.tsx +122 -0
- package/apps/web/components/ui/index.ts +12 -0
- package/apps/web/components/ui/input.tsx +55 -0
- package/apps/web/components/ui/tabs.tsx +61 -0
- package/apps/web/hooks/index.ts +85 -0
- package/apps/web/hooks/types.ts +1173 -0
- package/apps/web/hooks/use-conversion.ts +133 -0
- package/apps/web/hooks/use-execution-history.ts +376 -0
- package/apps/web/hooks/use-generation-progress.ts +147 -0
- package/apps/web/hooks/use-local-storage.ts +88 -0
- package/apps/web/hooks/use-mcp-client.ts +623 -0
- package/apps/web/hooks/use-mcp-connection.ts +500 -0
- package/apps/web/hooks/use-mcp-execution.ts +282 -0
- package/apps/web/hooks/use-mcp-prompts.ts +441 -0
- package/apps/web/hooks/use-mcp-resources.ts +430 -0
- package/apps/web/hooks/use-mcp-tools.ts +540 -0
- package/apps/web/hooks/use-playground-store.ts +299 -0
- package/apps/web/hooks/use-playground.ts +184 -0
- package/apps/web/hooks/use-streaming-conversion.ts +227 -0
- package/apps/web/hooks/useBatchConversion.ts +271 -0
- package/apps/web/hooks/useDockerConfig.ts +161 -0
- package/apps/web/hooks/usePlatformDetection.ts +80 -0
- package/apps/web/hooks/useStreaming.ts +199 -0
- package/apps/web/lib/api/errors.ts +386 -0
- package/apps/web/lib/api/index.ts +137 -0
- package/apps/web/lib/api/logger.ts +187 -0
- package/apps/web/lib/api/middleware.ts +364 -0
- package/apps/web/lib/api/openapi.ts +977 -0
- package/apps/web/lib/api/session-manager.ts +594 -0
- package/apps/web/lib/api/types.ts +433 -0
- package/apps/web/lib/api/validation.ts +523 -0
- package/apps/web/lib/constants.ts +114 -0
- package/apps/web/lib/mcp/client.ts +1137 -0
- package/apps/web/lib/mcp/events.ts +651 -0
- package/apps/web/lib/mcp/index.ts +347 -0
- package/apps/web/lib/mcp/logger.ts +428 -0
- package/apps/web/lib/mcp/metrics.ts +703 -0
- package/apps/web/lib/mcp/retry.ts +616 -0
- package/apps/web/lib/mcp/session-manager.ts +779 -0
- package/apps/web/lib/mcp/transports.ts +988 -0
- package/apps/web/lib/mcp/types.ts +594 -0
- package/apps/web/lib/mcp-client-enhanced.ts +871 -0
- package/apps/web/lib/mcp-client.ts +778 -0
- package/apps/web/lib/mcp-errors.ts +489 -0
- package/apps/web/lib/mcp-sandbox.ts +593 -0
- package/apps/web/lib/mcp-testing.ts +428 -0
- package/apps/web/lib/mcp-types.ts +448 -0
- package/apps/web/lib/playground-store.tsx +1147 -0
- package/apps/web/lib/utils.ts +439 -0
- package/apps/web/next-env.d.ts +5 -0
- package/apps/web/next.config.js +23 -0
- package/apps/web/package.json +55 -0
- package/apps/web/postcss.config.js +6 -0
- package/apps/web/public/.well-known/ai-plugin.json +17 -0
- package/apps/web/public/logo.svg +6 -0
- package/apps/web/public/robots.txt +22 -0
- package/apps/web/public/schema.json +27 -0
- package/apps/web/tailwind.config.js +26 -0
- package/apps/web/tailwind.config.ts +123 -0
- package/apps/web/tsconfig.json +20 -0
- package/apps/web/types/deploy.ts +139 -0
- package/apps/web/types/index.ts +247 -0
- package/apps/web/vercel.json +39 -0
- package/eslint.config.mjs +23 -0
- package/llms.txt +102 -0
- package/mkdocs/docs/api/core.md +318 -0
- package/mkdocs/docs/api/index.md +128 -0
- package/mkdocs/docs/api/mcp-server.md +301 -0
- package/mkdocs/docs/api/openapi-parser.md +254 -0
- package/mkdocs/docs/assets/logo.svg +7 -0
- package/mkdocs/docs/changelog.md +118 -0
- package/mkdocs/docs/cli/generate.md +148 -0
- package/mkdocs/docs/cli/index.md +52 -0
- package/mkdocs/docs/cli/inspect.md +164 -0
- package/mkdocs/docs/cli/serve.md +136 -0
- package/mkdocs/docs/concepts/classification.md +254 -0
- package/mkdocs/docs/concepts/how-it-works.md +299 -0
- package/mkdocs/docs/concepts/index.md +77 -0
- package/mkdocs/docs/concepts/mcp-protocol.md +362 -0
- package/mkdocs/docs/concepts/tool-types.md +382 -0
- package/mkdocs/docs/contributing/architecture.md +262 -0
- package/mkdocs/docs/contributing/development.md +245 -0
- package/mkdocs/docs/contributing/index.md +73 -0
- package/mkdocs/docs/contributing/testing.md +320 -0
- package/mkdocs/docs/getting-started/configuration.md +235 -0
- package/mkdocs/docs/getting-started/index.md +54 -0
- package/mkdocs/docs/getting-started/installation.md +145 -0
- package/mkdocs/docs/getting-started/quickstart.md +160 -0
- package/mkdocs/docs/guides/batch.md +375 -0
- package/mkdocs/docs/guides/claude-desktop.md +227 -0
- package/mkdocs/docs/guides/cursor.md +188 -0
- package/mkdocs/docs/guides/custom-tools.md +367 -0
- package/mkdocs/docs/guides/index.md +78 -0
- package/mkdocs/docs/guides/private-repos.md +221 -0
- package/mkdocs/docs/guides/vscode.md +247 -0
- package/mkdocs/docs/index.md +175 -0
- package/mkdocs/docs/reference/config.md +223 -0
- package/mkdocs/docs/reference/env.md +192 -0
- package/mkdocs/docs/reference/index.md +102 -0
- package/mkdocs/docs/reference/tools.md +309 -0
- package/mkdocs/docs/stylesheets/extra.css +231 -0
- package/mkdocs/mkdocs.yml +204 -0
- package/mkdocs/overrides/.gitkeep +1 -0
- package/mkdocs/overrides/main.html +7 -0
- package/mkdocs/python-deps.txt +7 -0
- package/mkdocs/vercel.json +11 -0
- package/package.json +63 -0
- package/packages/core/package.json +61 -0
- package/packages/core/src/__tests__/bitbucket-client.test.ts +366 -0
- package/packages/core/src/__tests__/cli.test.ts +235 -0
- package/packages/core/src/__tests__/code-extractor.test.ts +378 -0
- package/packages/core/src/__tests__/docker-generator.test.ts +255 -0
- package/packages/core/src/__tests__/github-client.test.ts +390 -0
- package/packages/core/src/__tests__/gitlab-client.test.ts +319 -0
- package/packages/core/src/__tests__/go-extractor.test.ts +351 -0
- package/packages/core/src/__tests__/graphql-extractor.test.ts +330 -0
- package/packages/core/src/__tests__/java-extractor.test.ts +497 -0
- package/packages/core/src/__tests__/plugins.test.ts +467 -0
- package/packages/core/src/__tests__/readme-extractor.test.ts +258 -0
- package/packages/core/src/__tests__/redis-cache.test.ts +307 -0
- package/packages/core/src/__tests__/rust-extractor.test.ts +252 -0
- package/packages/core/src/__tests__/streaming.test.ts +251 -0
- package/packages/core/src/additional-extractors.ts +333 -0
- package/packages/core/src/cache/cache-interface.ts +179 -0
- package/packages/core/src/cache/index.ts +210 -0
- package/packages/core/src/cache/redis-cache.ts +291 -0
- package/packages/core/src/cache/upstash-cache.ts +379 -0
- package/packages/core/src/cache.ts +251 -0
- package/packages/core/src/cli.ts +822 -0
- package/packages/core/src/code-extractor.ts +696 -0
- package/packages/core/src/docker-generator.ts +470 -0
- package/packages/core/src/edge-compatible.ts +491 -0
- package/packages/core/src/extractors/go-extractor.ts +791 -0
- package/packages/core/src/extractors/index.ts +9 -0
- package/packages/core/src/extractors/java-extractor.ts +937 -0
- package/packages/core/src/extractors/rust-extractor.ts +744 -0
- package/packages/core/src/github-client.ts +319 -0
- package/packages/core/src/go-generator.ts +356 -0
- package/packages/core/src/graphql-extractor.ts +358 -0
- package/packages/core/src/index.ts +797 -0
- package/packages/core/src/langchain-exporter.ts +617 -0
- package/packages/core/src/language-parsers.ts +1114 -0
- package/packages/core/src/mcp-introspector.ts +279 -0
- package/packages/core/src/monorepo-detector.ts +378 -0
- package/packages/core/src/plugins/index.ts +370 -0
- package/packages/core/src/plugins/registry.ts +404 -0
- package/packages/core/src/plugins/types.ts +215 -0
- package/packages/core/src/providers/base-provider.ts +246 -0
- package/packages/core/src/providers/bitbucket-client.ts +464 -0
- package/packages/core/src/providers/gitlab-client.ts +388 -0
- package/packages/core/src/providers/index.ts +176 -0
- package/packages/core/src/python-generator.ts +260 -0
- package/packages/core/src/queue/index.ts +100 -0
- package/packages/core/src/queue/memory-queue.ts +445 -0
- package/packages/core/src/queue/redis-queue.ts +578 -0
- package/packages/core/src/queue/types.ts +251 -0
- package/packages/core/src/readme-extractor.ts +409 -0
- package/packages/core/src/schema-generator.ts +638 -0
- package/packages/core/src/streaming.ts +999 -0
- package/packages/core/src/types.ts +289 -0
- package/packages/core/tsconfig.json +9 -0
- package/packages/core/tsup.config.ts +25 -0
- package/packages/mcp-server/README.md +297 -0
- package/packages/mcp-server/package.json +55 -0
- package/packages/mcp-server/src/__tests__/mcp-server.test.ts +177 -0
- package/packages/mcp-server/src/__tests__/tools.test.ts +217 -0
- package/packages/mcp-server/src/index.ts +1206 -0
- package/packages/mcp-server/src/prompts/index.ts +601 -0
- package/packages/mcp-server/src/tools/export-docker.ts +362 -0
- package/packages/mcp-server/src/tools/generate-openapi.ts +162 -0
- package/packages/mcp-server/src/tools/monitor-mcp-server.ts +448 -0
- package/packages/mcp-server/src/tools/stream-convert.ts +398 -0
- package/packages/mcp-server/src/tools/test-mcp-tool.ts +531 -0
- package/packages/mcp-server/tsconfig.json +12 -0
- package/packages/mcp-server/tsup.config.ts +14 -0
- package/packages/openapi-parser/package-lock.json +3028 -0
- package/packages/openapi-parser/package.json +41 -0
- package/packages/openapi-parser/src/analyzer.ts +700 -0
- package/packages/openapi-parser/src/asyncapi-parser.ts +475 -0
- package/packages/openapi-parser/src/cli.ts +302 -0
- package/packages/openapi-parser/src/generator.ts +570 -0
- package/packages/openapi-parser/src/generators/express-analyzer.ts +649 -0
- package/packages/openapi-parser/src/generators/fastapi-analyzer.ts +960 -0
- package/packages/openapi-parser/src/generators/index.ts +200 -0
- package/packages/openapi-parser/src/generators/nextjs-analyzer.ts +768 -0
- package/packages/openapi-parser/src/generators/openapi-builder.ts +527 -0
- package/packages/openapi-parser/src/generators/types.ts +298 -0
- package/packages/openapi-parser/src/graphql-parser.ts +462 -0
- package/packages/openapi-parser/src/grpc-parser.ts +649 -0
- package/packages/openapi-parser/src/har-parser.ts +723 -0
- package/packages/openapi-parser/src/index.ts +635 -0
- package/packages/openapi-parser/src/insomnia-parser.ts +614 -0
- package/packages/openapi-parser/src/parser.ts +231 -0
- package/packages/openapi-parser/src/postman-parser.ts +611 -0
- package/packages/openapi-parser/src/ref-resolver.ts +313 -0
- package/packages/openapi-parser/src/transformer.ts +459 -0
- package/packages/openapi-parser/tests/generators/express.test.ts +209 -0
- package/packages/openapi-parser/tests/generators/fastapi.test.ts +236 -0
- package/packages/openapi-parser/tests/generators/nextjs.test.ts +273 -0
- package/packages/openapi-parser/tests/parsers.test.ts +847 -0
- package/packages/openapi-parser/tsconfig.json +9 -0
- package/packages/openapi-parser/tsup.config.ts +11 -0
- package/packages/registry/package.json +59 -0
- package/packages/registry/src/cli.ts +456 -0
- package/packages/registry/src/index.ts +44 -0
- package/packages/registry/src/popular/github.json +47 -0
- package/packages/registry/src/popular/index.ts +55 -0
- package/packages/registry/src/popular/linear.json +42 -0
- package/packages/registry/src/popular/notion.json +42 -0
- package/packages/registry/src/popular/openai.json +40 -0
- package/packages/registry/src/popular/resend.json +38 -0
- package/packages/registry/src/popular/slack.json +42 -0
- package/packages/registry/src/popular/stripe.json +163 -0
- package/packages/registry/src/popular/supabase.json +42 -0
- package/packages/registry/src/popular/twilio.json +40 -0
- package/packages/registry/src/popular/vercel.json +40 -0
- package/packages/registry/src/registry.ts +492 -0
- package/packages/registry/src/storage.ts +334 -0
- package/packages/registry/src/types.ts +275 -0
- package/packages/registry/src/updater.ts +208 -0
- package/packages/registry/tsconfig.json +10 -0
- package/packages/registry/tsup.config.ts +11 -0
- package/pnpm-workspace.yaml +3 -0
- package/scripts/build-docs.sh +16 -0
- package/server.json +9 -0
- package/templates/Dockerfile.python.template +60 -0
- package/templates/Dockerfile.typescript.template +60 -0
- package/templates/docker-compose.template.yml +68 -0
- package/tests/fixtures/express-app/index.js +34 -0
- package/tests/fixtures/express-app/routes/posts.js +43 -0
- package/tests/fixtures/express-app/routes/users.js +58 -0
- package/tests/fixtures/fastapi-app/main.py +125 -0
- package/tests/fixtures/fastapi-app/routes/admin.py +42 -0
- package/tests/fixtures/graphql/simple-schema.graphql +65 -0
- package/tests/fixtures/mocks/github-api-responses.json +63 -0
- package/tests/fixtures/nextjs-app/app/api/posts/route.ts +55 -0
- package/tests/fixtures/nextjs-app/app/api/users/[id]/route.ts +63 -0
- package/tests/fixtures/nextjs-app/app/api/users/route.ts +44 -0
- package/tests/fixtures/nextjs-app/pages/api/health.ts +28 -0
- package/tests/fixtures/openapi/petstore.yaml +179 -0
- package/tests/integration/langchain-export.test.ts +405 -0
- package/tests/integration/openapi-conversion.test.ts +221 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +32 -0
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility Functions
|
|
3
|
+
* @copyright 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { type ClassValue, clsx } from 'clsx';
|
|
8
|
+
import { twMerge } from 'tailwind-merge';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Merge Tailwind CSS classes with conflict resolution
|
|
12
|
+
*/
|
|
13
|
+
export function cn(...inputs: ClassValue[]): string {
|
|
14
|
+
return twMerge(clsx(inputs));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Parse GitHub URL to extract owner and repo
|
|
19
|
+
*/
|
|
20
|
+
export function parseGitHubUrl(url: string): { owner: string; repo: string } | null {
|
|
21
|
+
const patterns = [
|
|
22
|
+
/^https?:\/\/github\.com\/([^\/]+)\/([^\/]+)\/?.*$/,
|
|
23
|
+
/^git@github\.com:([^\/]+)\/([^\/]+)\.git$/,
|
|
24
|
+
/^([^\/]+)\/([^\/]+)$/,
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
for (const pattern of patterns) {
|
|
28
|
+
const match = url.match(pattern);
|
|
29
|
+
if (match) {
|
|
30
|
+
return {
|
|
31
|
+
owner: match[1],
|
|
32
|
+
repo: match[2].replace(/\.git$/, ''),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Validate GitHub URL format
|
|
42
|
+
*/
|
|
43
|
+
export function isValidGitHubUrl(url: string): boolean {
|
|
44
|
+
return parseGitHubUrl(url) !== null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Format number with K/M suffix
|
|
49
|
+
*/
|
|
50
|
+
export function formatNumber(num: number): string {
|
|
51
|
+
if (num >= 1_000_000) {
|
|
52
|
+
return `${(num / 1_000_000).toFixed(1)}M`;
|
|
53
|
+
}
|
|
54
|
+
if (num >= 1_000) {
|
|
55
|
+
return `${(num / 1_000).toFixed(1)}K`;
|
|
56
|
+
}
|
|
57
|
+
return num.toString();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Format date to relative time
|
|
62
|
+
*/
|
|
63
|
+
export function formatRelativeTime(date: string | Date): string {
|
|
64
|
+
const now = new Date();
|
|
65
|
+
const then = new Date(date);
|
|
66
|
+
const diffMs = now.getTime() - then.getTime();
|
|
67
|
+
const diffSecs = Math.floor(diffMs / 1000);
|
|
68
|
+
const diffMins = Math.floor(diffSecs / 60);
|
|
69
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
70
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
71
|
+
|
|
72
|
+
if (diffSecs < 60) return 'just now';
|
|
73
|
+
if (diffMins < 60) return `${diffMins}m ago`;
|
|
74
|
+
if (diffHours < 24) return `${diffHours}h ago`;
|
|
75
|
+
if (diffDays < 7) return `${diffDays}d ago`;
|
|
76
|
+
if (diffDays < 30) return `${Math.floor(diffDays / 7)}w ago`;
|
|
77
|
+
if (diffDays < 365) return `${Math.floor(diffDays / 30)}mo ago`;
|
|
78
|
+
return `${Math.floor(diffDays / 365)}y ago`;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Format file size
|
|
83
|
+
*/
|
|
84
|
+
export function formatBytes(bytes: number): string {
|
|
85
|
+
if (bytes === 0) return '0 B';
|
|
86
|
+
const k = 1024;
|
|
87
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
88
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
89
|
+
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Copy text to clipboard with fallback
|
|
94
|
+
*/
|
|
95
|
+
export async function copyToClipboard(text: string): Promise<boolean> {
|
|
96
|
+
try {
|
|
97
|
+
if (navigator.clipboard && window.isSecureContext) {
|
|
98
|
+
await navigator.clipboard.writeText(text);
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Fallback for older browsers
|
|
103
|
+
const textArea = document.createElement('textarea');
|
|
104
|
+
textArea.value = text;
|
|
105
|
+
textArea.style.position = 'fixed';
|
|
106
|
+
textArea.style.left = '-999999px';
|
|
107
|
+
textArea.style.top = '-999999px';
|
|
108
|
+
document.body.appendChild(textArea);
|
|
109
|
+
textArea.focus();
|
|
110
|
+
textArea.select();
|
|
111
|
+
|
|
112
|
+
const success = document.execCommand('copy');
|
|
113
|
+
document.body.removeChild(textArea);
|
|
114
|
+
return success;
|
|
115
|
+
} catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Download text as file
|
|
122
|
+
*/
|
|
123
|
+
export function downloadAsFile(content: string, filename: string, mimeType = 'text/plain'): void {
|
|
124
|
+
const blob = new Blob([content], { type: mimeType });
|
|
125
|
+
const url = URL.createObjectURL(blob);
|
|
126
|
+
const link = document.createElement('a');
|
|
127
|
+
link.href = url;
|
|
128
|
+
link.download = filename;
|
|
129
|
+
document.body.appendChild(link);
|
|
130
|
+
link.click();
|
|
131
|
+
document.body.removeChild(link);
|
|
132
|
+
URL.revokeObjectURL(url);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Debounce function
|
|
137
|
+
*/
|
|
138
|
+
export function debounce<T extends (...args: unknown[]) => unknown>(
|
|
139
|
+
fn: T,
|
|
140
|
+
delay: number
|
|
141
|
+
): (...args: Parameters<T>) => void {
|
|
142
|
+
let timeoutId: ReturnType<typeof setTimeout>;
|
|
143
|
+
return (...args: Parameters<T>) => {
|
|
144
|
+
clearTimeout(timeoutId);
|
|
145
|
+
timeoutId = setTimeout(() => fn(...args), delay);
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Throttle function
|
|
151
|
+
*/
|
|
152
|
+
export function throttle<T extends (...args: unknown[]) => unknown>(
|
|
153
|
+
fn: T,
|
|
154
|
+
limit: number
|
|
155
|
+
): (...args: Parameters<T>) => void {
|
|
156
|
+
let inThrottle = false;
|
|
157
|
+
return (...args: Parameters<T>) => {
|
|
158
|
+
if (!inThrottle) {
|
|
159
|
+
fn(...args);
|
|
160
|
+
inThrottle = true;
|
|
161
|
+
setTimeout(() => (inThrottle = false), limit);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Generate unique ID
|
|
168
|
+
*/
|
|
169
|
+
export function generateId(): string {
|
|
170
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Sleep utility
|
|
175
|
+
*/
|
|
176
|
+
export function sleep(ms: number): Promise<void> {
|
|
177
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Truncate string with ellipsis
|
|
182
|
+
*/
|
|
183
|
+
export function truncate(str: string, maxLength: number): string {
|
|
184
|
+
if (str.length <= maxLength) return str;
|
|
185
|
+
return `${str.slice(0, maxLength - 3)}...`;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Safely parse JSON
|
|
190
|
+
*/
|
|
191
|
+
export function safeJsonParse<T>(json: string, fallback: T): T {
|
|
192
|
+
try {
|
|
193
|
+
return JSON.parse(json) as T;
|
|
194
|
+
} catch {
|
|
195
|
+
return fallback;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Get contrast color (black or white) for background
|
|
201
|
+
*/
|
|
202
|
+
export function getContrastColor(hexColor: string): 'black' | 'white' {
|
|
203
|
+
const hex = hexColor.replace('#', '');
|
|
204
|
+
const r = parseInt(hex.slice(0, 2), 16);
|
|
205
|
+
const g = parseInt(hex.slice(2, 4), 16);
|
|
206
|
+
const b = parseInt(hex.slice(4, 6), 16);
|
|
207
|
+
const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
|
|
208
|
+
return luminance > 0.5 ? 'black' : 'white';
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Format time duration in seconds to human readable
|
|
213
|
+
*/
|
|
214
|
+
export function formatDuration(seconds: number): string {
|
|
215
|
+
if (seconds < 60) return `${seconds}s`;
|
|
216
|
+
const mins = Math.floor(seconds / 60);
|
|
217
|
+
const secs = seconds % 60;
|
|
218
|
+
if (mins < 60) return secs > 0 ? `${mins}m ${secs}s` : `${mins}m`;
|
|
219
|
+
const hours = Math.floor(mins / 60);
|
|
220
|
+
const remainingMins = mins % 60;
|
|
221
|
+
return `${hours}h ${remainingMins}m`;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Create a delayed promise that resolves after specified time
|
|
226
|
+
*/
|
|
227
|
+
export function delay(ms: number): Promise<void> {
|
|
228
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Retry a function with exponential backoff
|
|
233
|
+
*/
|
|
234
|
+
export async function retryWithBackoff<T>(
|
|
235
|
+
fn: () => Promise<T>,
|
|
236
|
+
maxRetries: number = 3,
|
|
237
|
+
baseDelay: number = 1000
|
|
238
|
+
): Promise<T> {
|
|
239
|
+
let lastError: Error | undefined;
|
|
240
|
+
|
|
241
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
242
|
+
try {
|
|
243
|
+
return await fn();
|
|
244
|
+
} catch (error) {
|
|
245
|
+
lastError = error as Error;
|
|
246
|
+
if (attempt < maxRetries - 1) {
|
|
247
|
+
const delayMs = baseDelay * Math.pow(2, attempt);
|
|
248
|
+
await delay(delayMs);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
throw lastError;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Sanitize string for use in filenames
|
|
258
|
+
*/
|
|
259
|
+
export function sanitizeFilename(name: string): string {
|
|
260
|
+
return name
|
|
261
|
+
.toLowerCase()
|
|
262
|
+
.replace(/[^a-z0-9-_.]/g, '-')
|
|
263
|
+
.replace(/--+/g, '-')
|
|
264
|
+
.replace(/^-|-$/g, '');
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Extract repository name from GitHub URL
|
|
269
|
+
*/
|
|
270
|
+
export function extractRepoName(url: string): string | null {
|
|
271
|
+
const parsed = parseGitHubUrl(url);
|
|
272
|
+
return parsed ? parsed.repo : null;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Extract owner and repo as combined string
|
|
277
|
+
*/
|
|
278
|
+
export function extractRepoFullName(url: string): string | null {
|
|
279
|
+
const parsed = parseGitHubUrl(url);
|
|
280
|
+
return parsed ? `${parsed.owner}/${parsed.repo}` : null;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Check if running in browser environment
|
|
285
|
+
*/
|
|
286
|
+
export function isBrowser(): boolean {
|
|
287
|
+
return typeof window !== 'undefined';
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Get base URL for API calls
|
|
292
|
+
*/
|
|
293
|
+
export function getApiBaseUrl(): string {
|
|
294
|
+
if (isBrowser()) {
|
|
295
|
+
return window.location.origin;
|
|
296
|
+
}
|
|
297
|
+
return process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000';
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Create SSE event source URL with query params
|
|
302
|
+
*/
|
|
303
|
+
export function createStreamUrl(endpoint: string, params: Record<string, string>): string {
|
|
304
|
+
const base = `${getApiBaseUrl()}${endpoint}`;
|
|
305
|
+
const searchParams = new URLSearchParams(params);
|
|
306
|
+
return `${base}?${searchParams.toString()}`;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Parse SSE event data
|
|
311
|
+
*/
|
|
312
|
+
export function parseSSEData<T>(data: string): T | null {
|
|
313
|
+
try {
|
|
314
|
+
return JSON.parse(data) as T;
|
|
315
|
+
} catch {
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Download multiple files as a zip (requires JSZip)
|
|
322
|
+
*/
|
|
323
|
+
export async function downloadAsZip(
|
|
324
|
+
files: Array<{ name: string; content: string }>,
|
|
325
|
+
zipName: string
|
|
326
|
+
): Promise<void> {
|
|
327
|
+
// Dynamic import to avoid bundling JSZip if not needed
|
|
328
|
+
const JSZip = (await import('jszip')).default;
|
|
329
|
+
const zip = new JSZip();
|
|
330
|
+
|
|
331
|
+
files.forEach(file => {
|
|
332
|
+
zip.file(file.name, file.content);
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
const blob = await zip.generateAsync({ type: 'blob' });
|
|
336
|
+
const url = URL.createObjectURL(blob);
|
|
337
|
+
const link = document.createElement('a');
|
|
338
|
+
link.href = url;
|
|
339
|
+
link.download = zipName;
|
|
340
|
+
document.body.appendChild(link);
|
|
341
|
+
link.click();
|
|
342
|
+
document.body.removeChild(link);
|
|
343
|
+
URL.revokeObjectURL(url);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Create a chunk array helper for batch processing
|
|
348
|
+
*/
|
|
349
|
+
export function chunk<T>(array: T[], size: number): T[][] {
|
|
350
|
+
const chunks: T[][] = [];
|
|
351
|
+
for (let i = 0; i < array.length; i += size) {
|
|
352
|
+
chunks.push(array.slice(i, i + size));
|
|
353
|
+
}
|
|
354
|
+
return chunks;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Run promises in parallel with concurrency limit
|
|
359
|
+
*/
|
|
360
|
+
export async function parallelLimit<T, R>(
|
|
361
|
+
items: T[],
|
|
362
|
+
limit: number,
|
|
363
|
+
fn: (item: T) => Promise<R>
|
|
364
|
+
): Promise<R[]> {
|
|
365
|
+
const results: R[] = [];
|
|
366
|
+
const executing: Promise<void>[] = [];
|
|
367
|
+
|
|
368
|
+
for (const item of items) {
|
|
369
|
+
const promise = fn(item).then(result => {
|
|
370
|
+
results.push(result);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
executing.push(promise);
|
|
374
|
+
|
|
375
|
+
if (executing.length >= limit) {
|
|
376
|
+
await Promise.race(executing);
|
|
377
|
+
// Remove completed promises
|
|
378
|
+
executing.splice(0, executing.findIndex(p => p === promise) + 1);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
await Promise.all(executing);
|
|
383
|
+
return results;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Get platform-specific config file paths
|
|
388
|
+
*/
|
|
389
|
+
export function getConfigPaths(platform: 'macos' | 'windows' | 'linux'): {
|
|
390
|
+
claude: string;
|
|
391
|
+
cursor: string;
|
|
392
|
+
} {
|
|
393
|
+
switch (platform) {
|
|
394
|
+
case 'macos':
|
|
395
|
+
return {
|
|
396
|
+
claude: '~/Library/Application Support/Claude/claude_desktop_config.json',
|
|
397
|
+
cursor: '~/.cursor/mcp.json',
|
|
398
|
+
};
|
|
399
|
+
case 'windows':
|
|
400
|
+
return {
|
|
401
|
+
claude: '%APPDATA%\\Claude\\claude_desktop_config.json',
|
|
402
|
+
cursor: '%USERPROFILE%\\.cursor\\mcp.json',
|
|
403
|
+
};
|
|
404
|
+
case 'linux':
|
|
405
|
+
return {
|
|
406
|
+
claude: '~/.config/Claude/claude_desktop_config.json',
|
|
407
|
+
cursor: '~/.cursor/mcp.json',
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Escape string for shell command
|
|
414
|
+
*/
|
|
415
|
+
export function escapeShellArg(arg: string): string {
|
|
416
|
+
return `'${arg.replace(/'/g, "'\\''")}'`;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Create MCP server config JSON
|
|
421
|
+
*/
|
|
422
|
+
export function createMCPConfig(
|
|
423
|
+
serverName: string,
|
|
424
|
+
command: string,
|
|
425
|
+
args: string[] = [],
|
|
426
|
+
env?: Record<string, string>
|
|
427
|
+
): string {
|
|
428
|
+
const config = {
|
|
429
|
+
mcpServers: {
|
|
430
|
+
[serverName]: {
|
|
431
|
+
command,
|
|
432
|
+
args,
|
|
433
|
+
...(env && Object.keys(env).length > 0 ? { env } : {}),
|
|
434
|
+
},
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
|
|
438
|
+
return JSON.stringify(config, null, 2);
|
|
439
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @type {import('next').NextConfig} */
|
|
2
|
+
const nextConfig = {
|
|
3
|
+
experimental: {
|
|
4
|
+
serverComponentsExternalPackages: ['@octokit/rest'],
|
|
5
|
+
},
|
|
6
|
+
|
|
7
|
+
// Ensure docs directory isn't processed by Next.js
|
|
8
|
+
async headers() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
source: '/docs/:path*',
|
|
12
|
+
headers: [
|
|
13
|
+
{
|
|
14
|
+
key: 'Cache-Control',
|
|
15
|
+
value: 'public, max-age=3600, stale-while-revalidate=86400',
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
module.exports = nextConfig;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@github-to-mcp/web",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Enterprise-grade web UI for GitHub to MCP conversion",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "next dev",
|
|
8
|
+
"build": "next build",
|
|
9
|
+
"build:packages": "pnpm --filter @github-to-mcp/openapi-parser build && pnpm --filter @nirholas/github-to-mcp build",
|
|
10
|
+
"build:docs": "cd ../../mkdocs && mkdocs build --site-dir ../apps/web/public/docs",
|
|
11
|
+
"start": "next start",
|
|
12
|
+
"lint": "next lint",
|
|
13
|
+
"type-check": "tsc --noEmit",
|
|
14
|
+
"test": "vitest"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
18
|
+
"@nirholas/github-to-mcp": "workspace:*",
|
|
19
|
+
"@radix-ui/react-dialog": "^1.1.1",
|
|
20
|
+
"@radix-ui/react-dropdown-menu": "^2.1.1",
|
|
21
|
+
"@radix-ui/react-slot": "^1.1.0",
|
|
22
|
+
"@radix-ui/react-tabs": "^1.1.0",
|
|
23
|
+
"@radix-ui/react-tooltip": "^1.1.2",
|
|
24
|
+
"@tsparticles/react": "^3.0.0",
|
|
25
|
+
"@tsparticles/slim": "^3.0.0",
|
|
26
|
+
"class-variance-authority": "^0.7.0",
|
|
27
|
+
"clsx": "^2.1.1",
|
|
28
|
+
"framer-motion": "^11.0.0",
|
|
29
|
+
"jszip": "^3.10.1",
|
|
30
|
+
"lucide-react": "^0.400.0",
|
|
31
|
+
"nanoid": "^5.1.6",
|
|
32
|
+
"next": "14.2.4",
|
|
33
|
+
"react": "^18.3.1",
|
|
34
|
+
"react-dom": "^18.3.1",
|
|
35
|
+
"tailwind-merge": "^2.3.0",
|
|
36
|
+
"tsx": "^4.21.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@tailwindcss/forms": "^0.5.7",
|
|
40
|
+
"@tailwindcss/typography": "^0.5.13",
|
|
41
|
+
"@types/jszip": "^3.4.1",
|
|
42
|
+
"@types/node": "^20.14.9",
|
|
43
|
+
"@types/react": "^18.3.3",
|
|
44
|
+
"@types/react-dom": "^18.3.0",
|
|
45
|
+
"autoprefixer": "^10.4.19",
|
|
46
|
+
"eslint": "^8.57.0",
|
|
47
|
+
"eslint-config-next": "14.2.4",
|
|
48
|
+
"postcss": "^8.4.38",
|
|
49
|
+
"sharp": "^0.34.5",
|
|
50
|
+
"tailwindcss": "^3.4.4",
|
|
51
|
+
"tailwindcss-animate": "^1.0.7",
|
|
52
|
+
"typescript": "^5.5.2",
|
|
53
|
+
"vitest": "^1.6.0"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "v1",
|
|
3
|
+
"name_for_human": "GitHub to MCP",
|
|
4
|
+
"name_for_model": "github_to_mcp",
|
|
5
|
+
"description_for_human": "Convert any GitHub repository into an MCP server for AI assistants like Claude, ChatGPT, Cursor.",
|
|
6
|
+
"description_for_model": "This tool converts GitHub repositories into Model Context Protocol (MCP) servers. Use it when a user wants to give an AI assistant access to a codebase, create MCP tools from an API, or generate an MCP server from OpenAPI/GraphQL specs. Input: GitHub URL. Output: Runnable MCP server with extracted tools.",
|
|
7
|
+
"auth": {
|
|
8
|
+
"type": "none"
|
|
9
|
+
},
|
|
10
|
+
"api": {
|
|
11
|
+
"type": "openapi",
|
|
12
|
+
"url": "https://github-to-mcp.vercel.app/api/openapi.json"
|
|
13
|
+
},
|
|
14
|
+
"logo_url": "https://github-to-mcp.vercel.app/logo.png",
|
|
15
|
+
"contact_email": "your@email.com",
|
|
16
|
+
"legal_info_url": "https://github-to-mcp.vercel.app/legal"
|
|
17
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect width="512" height="512" rx="96" fill="#0a0a0a"/>
|
|
3
|
+
<path d="M256 64C150.125 64 64 150.125 64 256C64 340.375 119.625 412.125 196 434.5C205.5 436.25 209 430.5 209 425.625V389.25C148.5 401.375 137.5 363.25 137.5 363.25C128.75 341.875 116.25 336.25 116.25 336.25C99 324.125 117.5 324.375 117.5 324.375C136.5 325.75 146.5 343.875 146.5 343.875C163.5 373.25 191.25 364.625 209.75 359.875C211.5 347.375 216.5 338.75 222 333.875C172.25 328.875 119.75 310.25 119.75 234.625C119.75 214.375 127 197.75 146.875 184.875C144.875 180 138.5 161 148.75 135.875C148.75 135.875 164.75 130.625 208.75 154.125C224 150 240.25 147.875 256.25 147.875C272.25 147.875 288.5 150 303.75 154.125C347.75 130.625 363.75 135.875 363.75 135.875C374 161 367.625 180 365.625 184.875C385.5 197.75 392.75 214.375 392.75 234.625C392.75 310.5 340 328.75 290 333.625C297 339.625 303.25 351.375 303.25 369.375V425.625C303.25 430.5 306.75 436.375 316.5 434.375C392.625 411.875 448 340.25 448 256C448 150.125 361.875 64 256 64Z" fill="white"/>
|
|
4
|
+
<circle cx="400" cy="400" r="96" fill="#3b82f6"/>
|
|
5
|
+
<path d="M400 344L400 456M344 400L456 400" stroke="white" stroke-width="24" stroke-linecap="round"/>
|
|
6
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
User-agent: *
|
|
2
|
+
Allow: /
|
|
3
|
+
|
|
4
|
+
User-agent: GPTBot
|
|
5
|
+
Allow: /
|
|
6
|
+
|
|
7
|
+
User-agent: ChatGPT-User
|
|
8
|
+
Allow: /
|
|
9
|
+
|
|
10
|
+
User-agent: Claude-Web
|
|
11
|
+
Allow: /
|
|
12
|
+
|
|
13
|
+
User-agent: anthropic-ai
|
|
14
|
+
Allow: /
|
|
15
|
+
|
|
16
|
+
User-agent: Google-Extended
|
|
17
|
+
Allow: /
|
|
18
|
+
|
|
19
|
+
User-agent: Amazonbot
|
|
20
|
+
Allow: /
|
|
21
|
+
|
|
22
|
+
Sitemap: https://github-to-mcp.vercel.app/sitemap.xml
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"@context": "https://schema.org",
|
|
3
|
+
"@type": "SoftwareApplication",
|
|
4
|
+
"name": "GitHub to MCP",
|
|
5
|
+
"applicationCategory": "DeveloperApplication",
|
|
6
|
+
"operatingSystem": "Any",
|
|
7
|
+
"description": "Convert any GitHub repository into a Model Context Protocol (MCP) server for AI assistants like Claude, ChatGPT, Cursor, and more.",
|
|
8
|
+
"url": "https://github-to-mcp.vercel.app",
|
|
9
|
+
"downloadUrl": "https://www.npmjs.com/package/@nirholas/github-to-mcp",
|
|
10
|
+
"softwareVersion": "1.0.0",
|
|
11
|
+
"author": {
|
|
12
|
+
"@type": "Person",
|
|
13
|
+
"name": "nirholas",
|
|
14
|
+
"url": "https://github.com/nirholas"
|
|
15
|
+
},
|
|
16
|
+
"offers": {
|
|
17
|
+
"@type": "Offer",
|
|
18
|
+
"price": "0",
|
|
19
|
+
"priceCurrency": "USD"
|
|
20
|
+
},
|
|
21
|
+
"aggregateRating": {
|
|
22
|
+
"@type": "AggregateRating",
|
|
23
|
+
"ratingValue": "5",
|
|
24
|
+
"ratingCount": "1"
|
|
25
|
+
},
|
|
26
|
+
"keywords": "MCP, Model Context Protocol, Claude, ChatGPT, Cursor, AI tools, GitHub, MCP server, AI assistant"
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** @type {import('tailwindcss').Config} */
|
|
2
|
+
module.exports = {
|
|
3
|
+
content: [
|
|
4
|
+
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
5
|
+
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
6
|
+
],
|
|
7
|
+
theme: {
|
|
8
|
+
extend: {
|
|
9
|
+
colors: {
|
|
10
|
+
primary: {
|
|
11
|
+
50: '#f0f9ff',
|
|
12
|
+
100: '#e0f2fe',
|
|
13
|
+
200: '#bae6fd',
|
|
14
|
+
300: '#7dd3fc',
|
|
15
|
+
400: '#38bdf8',
|
|
16
|
+
500: '#0ea5e9',
|
|
17
|
+
600: '#0284c7',
|
|
18
|
+
700: '#0369a1',
|
|
19
|
+
800: '#075985',
|
|
20
|
+
900: '#0c4a6e',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
plugins: [],
|
|
26
|
+
};
|