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,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Command to browse public MCP server registry
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
import { StorageService } from '../utils/storage';
|
|
9
|
+
import { HistoryProvider } from '../views/historyProvider';
|
|
10
|
+
import { performConversion } from './convertFromUrl';
|
|
11
|
+
|
|
12
|
+
interface RegistryServer {
|
|
13
|
+
name: string;
|
|
14
|
+
description: string;
|
|
15
|
+
repoUrl: string;
|
|
16
|
+
category: string;
|
|
17
|
+
stars?: number;
|
|
18
|
+
author?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Built-in registry of popular MCP-compatible repositories
|
|
22
|
+
const REGISTRY_SERVERS: RegistryServer[] = [
|
|
23
|
+
{
|
|
24
|
+
name: 'Anthropic Claude Code',
|
|
25
|
+
description: 'AI coding assistant from Anthropic',
|
|
26
|
+
repoUrl: 'https://github.com/anthropics/claude-code',
|
|
27
|
+
category: 'AI Tools',
|
|
28
|
+
author: 'Anthropic'
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'Langchain',
|
|
32
|
+
description: 'Build applications with LLMs through composability',
|
|
33
|
+
repoUrl: 'https://github.com/langchain-ai/langchain',
|
|
34
|
+
category: 'AI Framework',
|
|
35
|
+
author: 'LangChain'
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'OpenAI Node',
|
|
39
|
+
description: 'Official Node.js library for OpenAI API',
|
|
40
|
+
repoUrl: 'https://github.com/openai/openai-node',
|
|
41
|
+
category: 'AI SDK',
|
|
42
|
+
author: 'OpenAI'
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
name: 'Vercel AI SDK',
|
|
46
|
+
description: 'Build AI-powered apps with React, Svelte, Vue',
|
|
47
|
+
repoUrl: 'https://github.com/vercel/ai',
|
|
48
|
+
category: 'AI SDK',
|
|
49
|
+
author: 'Vercel'
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
name: 'Hugging Face Transformers',
|
|
53
|
+
description: 'State-of-the-art ML for PyTorch, TensorFlow, JAX',
|
|
54
|
+
repoUrl: 'https://github.com/huggingface/transformers',
|
|
55
|
+
category: 'ML Framework',
|
|
56
|
+
author: 'Hugging Face'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
name: 'FastAPI',
|
|
60
|
+
description: 'Modern, fast web framework for building APIs',
|
|
61
|
+
repoUrl: 'https://github.com/tiangolo/fastapi',
|
|
62
|
+
category: 'Web Framework',
|
|
63
|
+
author: 'Sebastián Ramírez'
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
name: 'Prisma',
|
|
67
|
+
description: 'Next-generation ORM for Node.js and TypeScript',
|
|
68
|
+
repoUrl: 'https://github.com/prisma/prisma',
|
|
69
|
+
category: 'Database',
|
|
70
|
+
author: 'Prisma'
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'tRPC',
|
|
74
|
+
description: 'End-to-end typesafe APIs made easy',
|
|
75
|
+
repoUrl: 'https://github.com/trpc/trpc',
|
|
76
|
+
category: 'API Framework',
|
|
77
|
+
author: 'tRPC'
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: 'Stripe Node',
|
|
81
|
+
description: 'Node.js library for Stripe API',
|
|
82
|
+
repoUrl: 'https://github.com/stripe/stripe-node',
|
|
83
|
+
category: 'Payment',
|
|
84
|
+
author: 'Stripe'
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
name: 'Supabase',
|
|
88
|
+
description: 'Open source Firebase alternative',
|
|
89
|
+
repoUrl: 'https://github.com/supabase/supabase',
|
|
90
|
+
category: 'Database',
|
|
91
|
+
author: 'Supabase'
|
|
92
|
+
}
|
|
93
|
+
];
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Browse and convert from public MCP server registry
|
|
97
|
+
*/
|
|
98
|
+
export async function browseRegistryCommand(
|
|
99
|
+
storage: StorageService,
|
|
100
|
+
historyProvider: HistoryProvider,
|
|
101
|
+
extensionUri: vscode.Uri
|
|
102
|
+
): Promise<void> {
|
|
103
|
+
// Group servers by category
|
|
104
|
+
const categories = [...new Set(REGISTRY_SERVERS.map(s => s.category))];
|
|
105
|
+
|
|
106
|
+
// First, let user pick a category or view all
|
|
107
|
+
const categorySelection = await vscode.window.showQuickPick(
|
|
108
|
+
[
|
|
109
|
+
{ label: '$(list-flat) All Servers', value: 'all' },
|
|
110
|
+
{ label: '$(search) Search by Name', value: 'search' },
|
|
111
|
+
{ label: '', kind: vscode.QuickPickItemKind.Separator },
|
|
112
|
+
...categories.map(cat => ({
|
|
113
|
+
label: `$(folder) ${cat}`,
|
|
114
|
+
value: cat
|
|
115
|
+
}))
|
|
116
|
+
],
|
|
117
|
+
{
|
|
118
|
+
placeHolder: 'Select a category or search',
|
|
119
|
+
title: 'MCP Server Registry'
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
if (!categorySelection) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
let serversToShow: RegistryServer[];
|
|
128
|
+
|
|
129
|
+
// Type guard - separator items don't have value property
|
|
130
|
+
const selection = categorySelection as { label: string; value?: string };
|
|
131
|
+
const selectionValue = selection.value;
|
|
132
|
+
|
|
133
|
+
if (selectionValue === 'search') {
|
|
134
|
+
// Search mode
|
|
135
|
+
const searchQuery = await vscode.window.showInputBox({
|
|
136
|
+
prompt: 'Search for MCP servers',
|
|
137
|
+
placeHolder: 'Enter search term...'
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if (!searchQuery) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const query = searchQuery.toLowerCase();
|
|
145
|
+
serversToShow = REGISTRY_SERVERS.filter(
|
|
146
|
+
s => s.name.toLowerCase().includes(query) ||
|
|
147
|
+
s.description.toLowerCase().includes(query) ||
|
|
148
|
+
s.author?.toLowerCase().includes(query)
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
if (serversToShow.length === 0) {
|
|
152
|
+
vscode.window.showInformationMessage(`No servers found matching "${searchQuery}"`);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
} else if (selectionValue === 'all') {
|
|
156
|
+
serversToShow = REGISTRY_SERVERS;
|
|
157
|
+
} else {
|
|
158
|
+
serversToShow = REGISTRY_SERVERS.filter(s => s.category === selectionValue);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Show servers in the selected category
|
|
162
|
+
const serverItems: vscode.QuickPickItem[] = serversToShow.map(server => ({
|
|
163
|
+
label: `$(github) ${server.name}`,
|
|
164
|
+
description: server.author || '',
|
|
165
|
+
detail: server.description,
|
|
166
|
+
server: server
|
|
167
|
+
} as vscode.QuickPickItem & { server: RegistryServer }));
|
|
168
|
+
|
|
169
|
+
const selectedServer = await vscode.window.showQuickPick(serverItems, {
|
|
170
|
+
placeHolder: 'Select a server to convert',
|
|
171
|
+
title: 'MCP Server Registry',
|
|
172
|
+
matchOnDescription: true,
|
|
173
|
+
matchOnDetail: true
|
|
174
|
+
}) as (vscode.QuickPickItem & { server: RegistryServer }) | undefined;
|
|
175
|
+
|
|
176
|
+
if (!selectedServer) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Show server details and confirm
|
|
181
|
+
const action = await vscode.window.showInformationMessage(
|
|
182
|
+
`Convert ${selectedServer.server.name} to MCP server?`,
|
|
183
|
+
{ modal: true, detail: `${selectedServer.server.description}\n\nRepository: ${selectedServer.server.repoUrl}` },
|
|
184
|
+
'Convert',
|
|
185
|
+
'Open in Browser',
|
|
186
|
+
'Cancel'
|
|
187
|
+
);
|
|
188
|
+
|
|
189
|
+
if (action === 'Convert') {
|
|
190
|
+
await performConversion(selectedServer.server.repoUrl, storage, historyProvider, extensionUri);
|
|
191
|
+
} else if (action === 'Open in Browser') {
|
|
192
|
+
vscode.env.openExternal(vscode.Uri.parse(selectedServer.server.repoUrl));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Fetch registry from remote source (for future implementation)
|
|
198
|
+
*/
|
|
199
|
+
export async function fetchRemoteRegistry(): Promise<RegistryServer[]> {
|
|
200
|
+
// In the future, this could fetch from a remote registry API
|
|
201
|
+
// For now, return the built-in registry
|
|
202
|
+
return REGISTRY_SERVERS;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Add a custom server to the local registry
|
|
207
|
+
*/
|
|
208
|
+
export function addCustomServer(server: RegistryServer): void {
|
|
209
|
+
// This would persist to workspace state
|
|
210
|
+
REGISTRY_SERVERS.push(server);
|
|
211
|
+
}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Command to auto-configure Claude Desktop with MCP servers
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import { StorageService, ConversionResult } from '../utils/storage';
|
|
11
|
+
|
|
12
|
+
interface ClaudeDesktopConfig {
|
|
13
|
+
mcpServers?: Record<string, McpServerConfig>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface McpServerConfig {
|
|
17
|
+
command: string;
|
|
18
|
+
args?: string[];
|
|
19
|
+
env?: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Auto-configure Claude Desktop with MCP servers
|
|
24
|
+
*/
|
|
25
|
+
export async function configureClaudeDesktopCommand(
|
|
26
|
+
storage: StorageService
|
|
27
|
+
): Promise<void> {
|
|
28
|
+
// Get conversion history
|
|
29
|
+
const history = storage.getHistory();
|
|
30
|
+
|
|
31
|
+
if (history.length === 0) {
|
|
32
|
+
const response = await vscode.window.showWarningMessage(
|
|
33
|
+
'No converted MCP servers found. Would you like to convert a repository first?',
|
|
34
|
+
'Convert Repository',
|
|
35
|
+
'Cancel'
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
if (response === 'Convert Repository') {
|
|
39
|
+
vscode.commands.executeCommand('github-to-mcp.convertFromUrl');
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Let user select which servers to configure
|
|
45
|
+
const serverItems = history.map(item => ({
|
|
46
|
+
label: item.repoName,
|
|
47
|
+
description: `${item.toolCount} tools`,
|
|
48
|
+
picked: false,
|
|
49
|
+
result: item
|
|
50
|
+
}));
|
|
51
|
+
|
|
52
|
+
const selectedItems = await vscode.window.showQuickPick(serverItems, {
|
|
53
|
+
canPickMany: true,
|
|
54
|
+
placeHolder: 'Select MCP servers to add to Claude Desktop',
|
|
55
|
+
title: 'Configure Claude Desktop'
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (!selectedItems || selectedItems.length === 0) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Get Claude Desktop config path
|
|
63
|
+
const configPath = getClaudeDesktopConfigPath();
|
|
64
|
+
|
|
65
|
+
if (!configPath) {
|
|
66
|
+
vscode.window.showErrorMessage('Could not determine Claude Desktop config location for your platform.');
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Check if config file exists
|
|
71
|
+
const configUri = vscode.Uri.file(configPath);
|
|
72
|
+
let existingConfig: ClaudeDesktopConfig = {};
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
const configContent = await vscode.workspace.fs.readFile(configUri);
|
|
76
|
+
existingConfig = JSON.parse(Buffer.from(configContent).toString('utf-8'));
|
|
77
|
+
} catch {
|
|
78
|
+
// Config doesn't exist yet, we'll create it
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Initialize mcpServers if not present
|
|
82
|
+
if (!existingConfig.mcpServers) {
|
|
83
|
+
existingConfig.mcpServers = {};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Ask user for output directory
|
|
87
|
+
const outputDir = await getOutputDirectory();
|
|
88
|
+
if (!outputDir) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Generate and save MCP server files, then add to config
|
|
93
|
+
const addedServers: string[] = [];
|
|
94
|
+
const errors: string[] = [];
|
|
95
|
+
|
|
96
|
+
for (const item of selectedItems) {
|
|
97
|
+
const result = item.result as ConversionResult;
|
|
98
|
+
const serverName = result.repoName.replace('/', '-').toLowerCase();
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
// Generate the server file
|
|
102
|
+
const serverPath = await generateMcpServerFile(result, outputDir);
|
|
103
|
+
|
|
104
|
+
// Add to config
|
|
105
|
+
existingConfig.mcpServers![serverName] = {
|
|
106
|
+
command: 'node',
|
|
107
|
+
args: [serverPath]
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
addedServers.push(serverName);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
const msg = error instanceof Error ? error.message : 'Unknown error';
|
|
113
|
+
errors.push(`${serverName}: ${msg}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Write updated config
|
|
118
|
+
try {
|
|
119
|
+
// Ensure config directory exists
|
|
120
|
+
const configDir = path.dirname(configPath);
|
|
121
|
+
await vscode.workspace.fs.createDirectory(vscode.Uri.file(configDir));
|
|
122
|
+
|
|
123
|
+
// Write config file
|
|
124
|
+
await vscode.workspace.fs.writeFile(
|
|
125
|
+
configUri,
|
|
126
|
+
Buffer.from(JSON.stringify(existingConfig, null, 2), 'utf-8')
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
// Show results
|
|
130
|
+
if (addedServers.length > 0) {
|
|
131
|
+
const message = `Added ${addedServers.length} MCP server(s) to Claude Desktop config`;
|
|
132
|
+
const action = await vscode.window.showInformationMessage(
|
|
133
|
+
message,
|
|
134
|
+
'Open Config',
|
|
135
|
+
'Restart Claude Desktop',
|
|
136
|
+
'Done'
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
if (action === 'Open Config') {
|
|
140
|
+
const doc = await vscode.workspace.openTextDocument(configUri);
|
|
141
|
+
vscode.window.showTextDocument(doc);
|
|
142
|
+
} else if (action === 'Restart Claude Desktop') {
|
|
143
|
+
vscode.window.showInformationMessage(
|
|
144
|
+
'Please restart Claude Desktop for changes to take effect.',
|
|
145
|
+
'OK'
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (errors.length > 0) {
|
|
151
|
+
vscode.window.showWarningMessage(
|
|
152
|
+
`Some servers could not be added: ${errors.join(', ')}`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
} catch (error) {
|
|
156
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
157
|
+
vscode.window.showErrorMessage(`Failed to write Claude Desktop config: ${message}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Get the Claude Desktop config file path based on platform
|
|
163
|
+
*/
|
|
164
|
+
function getClaudeDesktopConfigPath(): string | null {
|
|
165
|
+
const platform = os.platform();
|
|
166
|
+
const homeDir = os.homedir();
|
|
167
|
+
|
|
168
|
+
switch (platform) {
|
|
169
|
+
case 'darwin': // macOS
|
|
170
|
+
return path.join(homeDir, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
171
|
+
|
|
172
|
+
case 'win32': // Windows
|
|
173
|
+
return path.join(homeDir, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');
|
|
174
|
+
|
|
175
|
+
case 'linux':
|
|
176
|
+
return path.join(homeDir, '.config', 'Claude', 'claude_desktop_config.json');
|
|
177
|
+
|
|
178
|
+
default:
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Get output directory for MCP server files
|
|
185
|
+
*/
|
|
186
|
+
async function getOutputDirectory(): Promise<string | null> {
|
|
187
|
+
const options = [
|
|
188
|
+
{
|
|
189
|
+
label: '$(home) User MCP Servers',
|
|
190
|
+
description: getDefaultMcpDirectory(),
|
|
191
|
+
value: getDefaultMcpDirectory()
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
label: '$(folder) Current Workspace',
|
|
195
|
+
description: vscode.workspace.workspaceFolders?.[0]?.uri.fsPath || 'No workspace open',
|
|
196
|
+
value: vscode.workspace.workspaceFolders?.[0]?.uri.fsPath
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
label: '$(folder-opened) Choose Custom Location...',
|
|
200
|
+
value: 'custom'
|
|
201
|
+
}
|
|
202
|
+
];
|
|
203
|
+
|
|
204
|
+
const selection = await vscode.window.showQuickPick(options, {
|
|
205
|
+
placeHolder: 'Where should MCP server files be saved?',
|
|
206
|
+
title: 'Output Location'
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
if (!selection) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (selection.value === 'custom') {
|
|
214
|
+
const folders = await vscode.window.showOpenDialog({
|
|
215
|
+
canSelectFolders: true,
|
|
216
|
+
canSelectFiles: false,
|
|
217
|
+
canSelectMany: false,
|
|
218
|
+
title: 'Select output directory for MCP servers'
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
if (!folders || folders.length === 0) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return folders[0].fsPath;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return selection.value || null;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Get default MCP directory
|
|
233
|
+
*/
|
|
234
|
+
function getDefaultMcpDirectory(): string {
|
|
235
|
+
const homeDir = os.homedir();
|
|
236
|
+
return path.join(homeDir, '.mcp-servers');
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Generate MCP server file from conversion result
|
|
241
|
+
*/
|
|
242
|
+
async function generateMcpServerFile(result: ConversionResult, outputDir: string): Promise<string> {
|
|
243
|
+
if (!result.code) {
|
|
244
|
+
throw new Error('No generated code available');
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const serverName = result.repoName.replace('/', '-').toLowerCase();
|
|
248
|
+
const serverDir = path.join(outputDir, serverName);
|
|
249
|
+
const serverFile = path.join(serverDir, 'index.js');
|
|
250
|
+
|
|
251
|
+
// Create server directory
|
|
252
|
+
await vscode.workspace.fs.createDirectory(vscode.Uri.file(serverDir));
|
|
253
|
+
|
|
254
|
+
// Write server file
|
|
255
|
+
await vscode.workspace.fs.writeFile(
|
|
256
|
+
vscode.Uri.file(serverFile),
|
|
257
|
+
Buffer.from(result.code, 'utf-8')
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
// Create package.json
|
|
261
|
+
const packageJson = {
|
|
262
|
+
name: `${serverName}-mcp`,
|
|
263
|
+
version: '1.0.0',
|
|
264
|
+
description: `MCP server generated from ${result.repoName}`,
|
|
265
|
+
main: 'index.js',
|
|
266
|
+
type: 'module',
|
|
267
|
+
dependencies: {
|
|
268
|
+
'@modelcontextprotocol/sdk': '^0.5.0'
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
await vscode.workspace.fs.writeFile(
|
|
273
|
+
vscode.Uri.file(path.join(serverDir, 'package.json')),
|
|
274
|
+
Buffer.from(JSON.stringify(packageJson, null, 2), 'utf-8')
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
return serverFile;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Check if Claude Desktop is likely installed
|
|
282
|
+
*/
|
|
283
|
+
export function isClaudeDesktopInstalled(): boolean {
|
|
284
|
+
const configPath = getClaudeDesktopConfigPath();
|
|
285
|
+
if (!configPath) {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Check if the Claude directory exists
|
|
290
|
+
const claudeDir = path.dirname(configPath);
|
|
291
|
+
try {
|
|
292
|
+
// This is a simple heuristic - the directory may exist even without full installation
|
|
293
|
+
return true;
|
|
294
|
+
} catch {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/**
|
|
300
|
+
* Open Claude Desktop config in editor
|
|
301
|
+
*/
|
|
302
|
+
export async function openClaudeDesktopConfig(): Promise<void> {
|
|
303
|
+
const configPath = getClaudeDesktopConfigPath();
|
|
304
|
+
if (!configPath) {
|
|
305
|
+
vscode.window.showErrorMessage('Could not determine Claude Desktop config location.');
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
try {
|
|
310
|
+
const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(configPath));
|
|
311
|
+
vscode.window.showTextDocument(doc);
|
|
312
|
+
} catch {
|
|
313
|
+
// Config doesn't exist, create it
|
|
314
|
+
const create = await vscode.window.showInformationMessage(
|
|
315
|
+
'Claude Desktop config file does not exist. Create it?',
|
|
316
|
+
'Create',
|
|
317
|
+
'Cancel'
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
if (create === 'Create') {
|
|
321
|
+
const configDir = path.dirname(configPath);
|
|
322
|
+
await vscode.workspace.fs.createDirectory(vscode.Uri.file(configDir));
|
|
323
|
+
await vscode.workspace.fs.writeFile(
|
|
324
|
+
vscode.Uri.file(configPath),
|
|
325
|
+
Buffer.from(JSON.stringify({ mcpServers: {} }, null, 2), 'utf-8')
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(configPath));
|
|
329
|
+
vscode.window.showTextDocument(doc);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Convert command implementation
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
import { StorageService, ConversionResult } from '../utils/storage';
|
|
9
|
+
import { HistoryProvider } from '../views/historyProvider';
|
|
10
|
+
import { showResultsPanel } from '../views/resultsPanel';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Convert a GitHub repository to MCP tools
|
|
14
|
+
*/
|
|
15
|
+
export async function convertCommand(
|
|
16
|
+
url: string,
|
|
17
|
+
storage: StorageService,
|
|
18
|
+
historyProvider: HistoryProvider
|
|
19
|
+
): Promise<void> {
|
|
20
|
+
return vscode.window.withProgress(
|
|
21
|
+
{
|
|
22
|
+
location: vscode.ProgressLocation.Notification,
|
|
23
|
+
title: 'Converting GitHub repository...',
|
|
24
|
+
cancellable: false
|
|
25
|
+
},
|
|
26
|
+
async (progress) => {
|
|
27
|
+
try {
|
|
28
|
+
progress.report({ message: 'Fetching repository data...' });
|
|
29
|
+
|
|
30
|
+
// Parse URL to get owner/repo
|
|
31
|
+
const match = url.match(/github\.com\/([\w-]+)\/([\w.-]+)/);
|
|
32
|
+
if (!match) {
|
|
33
|
+
throw new Error('Invalid GitHub URL');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const [, owner, repo] = match;
|
|
37
|
+
|
|
38
|
+
progress.report({ message: 'Analyzing repository...' });
|
|
39
|
+
|
|
40
|
+
// Import the core library dynamically to avoid bundling issues
|
|
41
|
+
const { generateFromGithub } = await import('@nirholas/github-to-mcp');
|
|
42
|
+
|
|
43
|
+
const result = await generateFromGithub(url, {
|
|
44
|
+
sources: ['readme', 'openapi', 'code']
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
progress.report({ message: 'Generating MCP server code...' });
|
|
48
|
+
|
|
49
|
+
const generatedCode = result.generate();
|
|
50
|
+
|
|
51
|
+
// Create conversion result
|
|
52
|
+
const conversionResult: ConversionResult = {
|
|
53
|
+
id: Date.now().toString(),
|
|
54
|
+
repoUrl: url,
|
|
55
|
+
repoName: `${owner}/${repo}`,
|
|
56
|
+
toolCount: result.tools.length,
|
|
57
|
+
timestamp: new Date().toISOString(),
|
|
58
|
+
classification: result.classification,
|
|
59
|
+
code: generatedCode,
|
|
60
|
+
tools: result.tools.map((t: { name: string; description: string }) => ({
|
|
61
|
+
name: t.name,
|
|
62
|
+
description: t.description
|
|
63
|
+
}))
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// Save to history
|
|
67
|
+
storage.addToHistory(conversionResult);
|
|
68
|
+
historyProvider.refresh();
|
|
69
|
+
|
|
70
|
+
// Show results panel
|
|
71
|
+
showResultsPanel(conversionResult, vscode.Uri.file(''));
|
|
72
|
+
|
|
73
|
+
vscode.window.showInformationMessage(
|
|
74
|
+
`Successfully converted ${owner}/${repo} - ${result.tools.length} tools found!`
|
|
75
|
+
);
|
|
76
|
+
} catch (error) {
|
|
77
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
78
|
+
vscode.window.showErrorMessage(`Failed to convert repository: ${message}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|