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,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Command to convert the currently open workspace repository
|
|
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
|
+
/**
|
|
13
|
+
* Convert the currently open GitHub repository to MCP server
|
|
14
|
+
*/
|
|
15
|
+
export async function convertCurrentRepoCommand(
|
|
16
|
+
storage: StorageService,
|
|
17
|
+
historyProvider: HistoryProvider,
|
|
18
|
+
extensionUri: vscode.Uri
|
|
19
|
+
): Promise<void> {
|
|
20
|
+
const workspaceFolders = vscode.workspace.workspaceFolders;
|
|
21
|
+
|
|
22
|
+
if (!workspaceFolders || workspaceFolders.length === 0) {
|
|
23
|
+
vscode.window.showWarningMessage('No workspace folder open. Please open a GitHub repository folder.');
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Try to get the GitHub URL from git config
|
|
28
|
+
const githubUrl = await getGitHubUrlFromWorkspace(workspaceFolders[0]);
|
|
29
|
+
|
|
30
|
+
if (!githubUrl) {
|
|
31
|
+
// Fallback to manual input if we can't detect
|
|
32
|
+
const response = await vscode.window.showWarningMessage(
|
|
33
|
+
'Could not detect GitHub repository. Would you like to enter the URL manually?',
|
|
34
|
+
'Enter URL',
|
|
35
|
+
'Cancel'
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
if (response === 'Enter URL') {
|
|
39
|
+
vscode.commands.executeCommand('github-to-mcp.convertFromUrl');
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Confirm with user
|
|
45
|
+
const repoPath = githubUrl.replace('https://github.com/', '');
|
|
46
|
+
const confirm = await vscode.window.showInformationMessage(
|
|
47
|
+
`Convert ${repoPath} to an MCP server?`,
|
|
48
|
+
'Yes',
|
|
49
|
+
'No'
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
if (confirm !== 'Yes') {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
await performConversion(githubUrl, storage, historyProvider, extensionUri);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Extract GitHub URL from workspace git config
|
|
61
|
+
*/
|
|
62
|
+
async function getGitHubUrlFromWorkspace(folder: vscode.WorkspaceFolder): Promise<string | null> {
|
|
63
|
+
try {
|
|
64
|
+
const gitConfigPath = vscode.Uri.joinPath(folder.uri, '.git', 'config');
|
|
65
|
+
const gitConfig = await vscode.workspace.fs.readFile(gitConfigPath);
|
|
66
|
+
const content = Buffer.from(gitConfig).toString('utf-8');
|
|
67
|
+
|
|
68
|
+
// Match HTTPS format: https://github.com/owner/repo.git
|
|
69
|
+
const httpsMatch = content.match(/url\s*=\s*https?:\/\/github\.com\/([\w-]+\/[\w.-]+?)(?:\.git)?$/m);
|
|
70
|
+
if (httpsMatch) {
|
|
71
|
+
return `https://github.com/${httpsMatch[1]}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Match SSH format: git@github.com:owner/repo.git
|
|
75
|
+
const sshMatch = content.match(/url\s*=\s*git@github\.com:([\w-]+\/[\w.-]+?)(?:\.git)?$/m);
|
|
76
|
+
if (sshMatch) {
|
|
77
|
+
return `https://github.com/${sshMatch[1]}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return null;
|
|
81
|
+
} catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Check if the current workspace is a GitHub repository
|
|
88
|
+
*/
|
|
89
|
+
export async function isCurrentWorkspaceGitHubRepo(): Promise<boolean> {
|
|
90
|
+
const workspaceFolders = vscode.workspace.workspaceFolders;
|
|
91
|
+
if (!workspaceFolders || workspaceFolders.length === 0) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const url = await getGitHubUrlFromWorkspace(workspaceFolders[0]);
|
|
96
|
+
return url !== null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Get the GitHub URL of the current workspace
|
|
101
|
+
*/
|
|
102
|
+
export async function getCurrentWorkspaceGitHubUrl(): Promise<string | null> {
|
|
103
|
+
const workspaceFolders = vscode.workspace.workspaceFolders;
|
|
104
|
+
if (!workspaceFolders || workspaceFolders.length === 0) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return getGitHubUrlFromWorkspace(workspaceFolders[0]);
|
|
109
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Command to convert a GitHub repository from URL input
|
|
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
|
+
* Prompt user for GitHub URL and convert to MCP server
|
|
14
|
+
*/
|
|
15
|
+
export async function convertFromUrlCommand(
|
|
16
|
+
storage: StorageService,
|
|
17
|
+
historyProvider: HistoryProvider,
|
|
18
|
+
extensionUri: vscode.Uri
|
|
19
|
+
): Promise<void> {
|
|
20
|
+
// Get URL from user input
|
|
21
|
+
const url = await vscode.window.showInputBox({
|
|
22
|
+
prompt: 'Enter GitHub repository URL',
|
|
23
|
+
placeHolder: 'https://github.com/owner/repo',
|
|
24
|
+
ignoreFocusOut: true,
|
|
25
|
+
validateInput: (value) => {
|
|
26
|
+
if (!value) {
|
|
27
|
+
return 'URL is required';
|
|
28
|
+
}
|
|
29
|
+
if (!value.match(/^https?:\/\/github\.com\/[\w-]+\/[\w.-]+/)) {
|
|
30
|
+
return 'Invalid GitHub URL format. Expected: https://github.com/owner/repo';
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
if (!url) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await performConversion(url, storage, historyProvider, extensionUri);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Perform the actual conversion
|
|
45
|
+
*/
|
|
46
|
+
export async function performConversion(
|
|
47
|
+
url: string,
|
|
48
|
+
storage: StorageService,
|
|
49
|
+
historyProvider: HistoryProvider,
|
|
50
|
+
extensionUri: vscode.Uri
|
|
51
|
+
): Promise<ConversionResult | undefined> {
|
|
52
|
+
return vscode.window.withProgress(
|
|
53
|
+
{
|
|
54
|
+
location: vscode.ProgressLocation.Notification,
|
|
55
|
+
title: 'Converting GitHub repository...',
|
|
56
|
+
cancellable: true
|
|
57
|
+
},
|
|
58
|
+
async (progress, token) => {
|
|
59
|
+
try {
|
|
60
|
+
// Parse URL to get owner/repo
|
|
61
|
+
const match = url.match(/github\.com\/([\w-]+)\/([\w.-]+)/);
|
|
62
|
+
if (!match) {
|
|
63
|
+
throw new Error('Invalid GitHub URL');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const [, owner, repo] = match;
|
|
67
|
+
|
|
68
|
+
if (token.isCancellationRequested) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
progress.report({ message: 'Fetching repository data...', increment: 10 });
|
|
73
|
+
|
|
74
|
+
// Import the core library dynamically to avoid bundling issues
|
|
75
|
+
const { generateFromGithub } = await import('@nirholas/github-to-mcp');
|
|
76
|
+
|
|
77
|
+
if (token.isCancellationRequested) {
|
|
78
|
+
return undefined;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
progress.report({ message: 'Analyzing repository...', increment: 30 });
|
|
82
|
+
|
|
83
|
+
const result = await generateFromGithub(url, {
|
|
84
|
+
sources: ['readme', 'openapi', 'code']
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
if (token.isCancellationRequested) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
progress.report({ message: 'Generating MCP server code...', increment: 40 });
|
|
92
|
+
|
|
93
|
+
const generatedCode = result.generate();
|
|
94
|
+
|
|
95
|
+
progress.report({ message: 'Finalizing...', increment: 20 });
|
|
96
|
+
|
|
97
|
+
// Create conversion result
|
|
98
|
+
const conversionResult: ConversionResult = {
|
|
99
|
+
id: Date.now().toString(),
|
|
100
|
+
repoUrl: url,
|
|
101
|
+
repoName: `${owner}/${repo}`,
|
|
102
|
+
toolCount: result.tools.length,
|
|
103
|
+
timestamp: new Date().toISOString(),
|
|
104
|
+
classification: result.classification,
|
|
105
|
+
code: generatedCode,
|
|
106
|
+
tools: result.tools.map((t: { name: string; description: string; parameters?: unknown }) => ({
|
|
107
|
+
name: t.name,
|
|
108
|
+
description: t.description,
|
|
109
|
+
parameters: t.parameters
|
|
110
|
+
}))
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// Save to history
|
|
114
|
+
storage.addToHistory(conversionResult);
|
|
115
|
+
historyProvider.refresh();
|
|
116
|
+
|
|
117
|
+
// Show results panel
|
|
118
|
+
showResultsPanel(conversionResult, extensionUri);
|
|
119
|
+
|
|
120
|
+
vscode.window.showInformationMessage(
|
|
121
|
+
`Successfully converted ${owner}/${repo} - ${result.tools.length} tools found!`,
|
|
122
|
+
'View Details',
|
|
123
|
+
'Copy Config'
|
|
124
|
+
).then((selection) => {
|
|
125
|
+
if (selection === 'Copy Config') {
|
|
126
|
+
vscode.commands.executeCommand('github-to-mcp.copyConfig');
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
return conversionResult;
|
|
131
|
+
} catch (error) {
|
|
132
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
133
|
+
vscode.window.showErrorMessage(`Failed to convert repository: ${message}`);
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Command registration and exports
|
|
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
|
+
|
|
11
|
+
// Re-export individual commands
|
|
12
|
+
export { convertCommand } from './convert';
|
|
13
|
+
export { validateCommand } from './validate';
|
|
14
|
+
export { convertFromUrlCommand, performConversion } from './convertFromUrl';
|
|
15
|
+
export { convertCurrentRepoCommand, isCurrentWorkspaceGitHubRepo, getCurrentWorkspaceGitHubUrl } from './convertCurrentRepo';
|
|
16
|
+
export { browseRegistryCommand, fetchRemoteRegistry } from './browseRegistry';
|
|
17
|
+
export { configureClaudeDesktopCommand, isClaudeDesktopInstalled, openClaudeDesktopConfig } from './configureClaudeDesktop';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Register all commands with VS Code
|
|
21
|
+
*/
|
|
22
|
+
export function registerCommands(
|
|
23
|
+
context: vscode.ExtensionContext,
|
|
24
|
+
storage: StorageService,
|
|
25
|
+
historyProvider: HistoryProvider
|
|
26
|
+
): vscode.Disposable[] {
|
|
27
|
+
const { convertFromUrlCommand } = require('./convertFromUrl');
|
|
28
|
+
const { convertCurrentRepoCommand } = require('./convertCurrentRepo');
|
|
29
|
+
const { browseRegistryCommand } = require('./browseRegistry');
|
|
30
|
+
const { configureClaudeDesktopCommand, openClaudeDesktopConfig } = require('./configureClaudeDesktop');
|
|
31
|
+
|
|
32
|
+
const extensionUri = context.extensionUri;
|
|
33
|
+
|
|
34
|
+
const disposables: vscode.Disposable[] = [];
|
|
35
|
+
|
|
36
|
+
// Convert from URL command
|
|
37
|
+
disposables.push(
|
|
38
|
+
vscode.commands.registerCommand('github-to-mcp.convertFromUrl', () =>
|
|
39
|
+
convertFromUrlCommand(storage, historyProvider, extensionUri)
|
|
40
|
+
)
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// Convert current repo command
|
|
44
|
+
disposables.push(
|
|
45
|
+
vscode.commands.registerCommand('github-to-mcp.convertCurrentRepo', () =>
|
|
46
|
+
convertCurrentRepoCommand(storage, historyProvider, extensionUri)
|
|
47
|
+
)
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
// Browse registry command
|
|
51
|
+
disposables.push(
|
|
52
|
+
vscode.commands.registerCommand('github-to-mcp.browseRegistry', () =>
|
|
53
|
+
browseRegistryCommand(storage, historyProvider, extensionUri)
|
|
54
|
+
)
|
|
55
|
+
);
|
|
56
|
+
|
|
57
|
+
// Configure Claude Desktop command
|
|
58
|
+
disposables.push(
|
|
59
|
+
vscode.commands.registerCommand('github-to-mcp.configureClaudeDesktop', () =>
|
|
60
|
+
configureClaudeDesktopCommand(storage)
|
|
61
|
+
)
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// Open Claude Desktop config command
|
|
65
|
+
disposables.push(
|
|
66
|
+
vscode.commands.registerCommand('github-to-mcp.openClaudeConfig', () =>
|
|
67
|
+
openClaudeDesktopConfig()
|
|
68
|
+
)
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// Clear history command
|
|
72
|
+
disposables.push(
|
|
73
|
+
vscode.commands.registerCommand('github-to-mcp.clearHistory', async () => {
|
|
74
|
+
const confirm = await vscode.window.showWarningMessage(
|
|
75
|
+
'Are you sure you want to clear all conversion history?',
|
|
76
|
+
{ modal: true },
|
|
77
|
+
'Clear',
|
|
78
|
+
'Cancel'
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
if (confirm === 'Clear') {
|
|
82
|
+
storage.clearHistory();
|
|
83
|
+
historyProvider.refresh();
|
|
84
|
+
vscode.window.showInformationMessage('Conversion history cleared.');
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// Refresh history command
|
|
90
|
+
disposables.push(
|
|
91
|
+
vscode.commands.registerCommand('github-to-mcp.refreshHistory', () => {
|
|
92
|
+
historyProvider.refresh();
|
|
93
|
+
})
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
// Export server command
|
|
97
|
+
disposables.push(
|
|
98
|
+
vscode.commands.registerCommand('github-to-mcp.exportServer', async (item) => {
|
|
99
|
+
if (!item?.code) {
|
|
100
|
+
vscode.window.showWarningMessage('No server code to export.');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const saveUri = await vscode.window.showSaveDialog({
|
|
105
|
+
defaultUri: vscode.Uri.file(`${item.repoName.replace('/', '-')}-mcp.js`),
|
|
106
|
+
filters: {
|
|
107
|
+
'JavaScript': ['js'],
|
|
108
|
+
'TypeScript': ['ts']
|
|
109
|
+
},
|
|
110
|
+
title: 'Export MCP Server'
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
if (saveUri) {
|
|
114
|
+
await vscode.workspace.fs.writeFile(saveUri, Buffer.from(item.code, 'utf-8'));
|
|
115
|
+
vscode.window.showInformationMessage(`Server exported to ${saveUri.fsPath}`);
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
return disposables;
|
|
121
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Validate command implementation
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as vscode from 'vscode';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Validate a generated MCP server file
|
|
11
|
+
*/
|
|
12
|
+
export async function validateCommand(): Promise<void> {
|
|
13
|
+
const fileUri = await vscode.window.showOpenDialog({
|
|
14
|
+
canSelectFiles: true,
|
|
15
|
+
canSelectFolders: false,
|
|
16
|
+
canSelectMany: false,
|
|
17
|
+
filters: {
|
|
18
|
+
'TypeScript': ['ts'],
|
|
19
|
+
'JavaScript': ['js'],
|
|
20
|
+
'Python': ['py']
|
|
21
|
+
},
|
|
22
|
+
title: 'Select MCP server file to validate'
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (!fileUri || fileUri.length === 0) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const filePath = fileUri[0].fsPath;
|
|
30
|
+
|
|
31
|
+
await vscode.window.withProgress(
|
|
32
|
+
{
|
|
33
|
+
location: vscode.ProgressLocation.Notification,
|
|
34
|
+
title: 'Validating MCP server...',
|
|
35
|
+
cancellable: false
|
|
36
|
+
},
|
|
37
|
+
async (progress) => {
|
|
38
|
+
try {
|
|
39
|
+
progress.report({ message: 'Reading file...' });
|
|
40
|
+
|
|
41
|
+
const document = await vscode.workspace.openTextDocument(fileUri[0]);
|
|
42
|
+
const content = document.getText();
|
|
43
|
+
|
|
44
|
+
progress.report({ message: 'Analyzing structure...' });
|
|
45
|
+
|
|
46
|
+
const issues: ValidationIssue[] = [];
|
|
47
|
+
|
|
48
|
+
// Check for basic MCP server structure
|
|
49
|
+
if (filePath.endsWith('.ts') || filePath.endsWith('.js')) {
|
|
50
|
+
issues.push(...validateTypeScriptMcp(content));
|
|
51
|
+
} else if (filePath.endsWith('.py')) {
|
|
52
|
+
issues.push(...validatePythonMcp(content));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Display results
|
|
56
|
+
if (issues.length === 0) {
|
|
57
|
+
vscode.window.showInformationMessage('✓ MCP server validation passed!');
|
|
58
|
+
} else {
|
|
59
|
+
const channel = vscode.window.createOutputChannel('MCP Validation');
|
|
60
|
+
channel.clear();
|
|
61
|
+
channel.appendLine('MCP Server Validation Results');
|
|
62
|
+
channel.appendLine('=' .repeat(40));
|
|
63
|
+
channel.appendLine('');
|
|
64
|
+
|
|
65
|
+
for (const issue of issues) {
|
|
66
|
+
const icon = issue.severity === 'error' ? '✗' : '⚠';
|
|
67
|
+
channel.appendLine(`${icon} Line ${issue.line || '?'}: ${issue.message}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
channel.show();
|
|
71
|
+
vscode.window.showWarningMessage(
|
|
72
|
+
`Validation found ${issues.length} issue(s). See output for details.`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
} catch (error) {
|
|
76
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
77
|
+
vscode.window.showErrorMessage(`Validation failed: ${message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
interface ValidationIssue {
|
|
84
|
+
severity: 'error' | 'warning';
|
|
85
|
+
message: string;
|
|
86
|
+
line?: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Validate TypeScript/JavaScript MCP server
|
|
91
|
+
*/
|
|
92
|
+
function validateTypeScriptMcp(content: string): ValidationIssue[] {
|
|
93
|
+
const issues: ValidationIssue[] = [];
|
|
94
|
+
const lines = content.split('\n');
|
|
95
|
+
|
|
96
|
+
// Check for MCP SDK import
|
|
97
|
+
if (!content.includes('@modelcontextprotocol/sdk')) {
|
|
98
|
+
issues.push({
|
|
99
|
+
severity: 'error',
|
|
100
|
+
message: 'Missing @modelcontextprotocol/sdk import'
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Check for Server instantiation
|
|
105
|
+
if (!content.includes('new Server(')) {
|
|
106
|
+
issues.push({
|
|
107
|
+
severity: 'error',
|
|
108
|
+
message: 'Missing Server instantiation'
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Check for ListToolsRequestSchema handler
|
|
113
|
+
if (!content.includes('ListToolsRequestSchema')) {
|
|
114
|
+
issues.push({
|
|
115
|
+
severity: 'warning',
|
|
116
|
+
message: 'Missing ListToolsRequestSchema handler - tools may not be listed'
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Check for CallToolRequestSchema handler
|
|
121
|
+
if (!content.includes('CallToolRequestSchema')) {
|
|
122
|
+
issues.push({
|
|
123
|
+
severity: 'warning',
|
|
124
|
+
message: 'Missing CallToolRequestSchema handler - tools may not be callable'
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Check for transport
|
|
129
|
+
if (!content.includes('StdioServerTransport') && !content.includes('transport')) {
|
|
130
|
+
issues.push({
|
|
131
|
+
severity: 'warning',
|
|
132
|
+
message: 'Missing transport configuration'
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Check for async function syntax errors (basic)
|
|
137
|
+
lines.forEach((line, index) => {
|
|
138
|
+
if (line.includes('async function') && !line.includes('{') && !lines[index + 1]?.includes('{')) {
|
|
139
|
+
issues.push({
|
|
140
|
+
severity: 'warning',
|
|
141
|
+
message: 'Async function may be missing body',
|
|
142
|
+
line: index + 1
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
return issues;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Validate Python MCP server
|
|
152
|
+
*/
|
|
153
|
+
function validatePythonMcp(content: string): ValidationIssue[] {
|
|
154
|
+
const issues: ValidationIssue[] = [];
|
|
155
|
+
|
|
156
|
+
// Check for mcp import
|
|
157
|
+
if (!content.includes('from mcp') && !content.includes('import mcp')) {
|
|
158
|
+
issues.push({
|
|
159
|
+
severity: 'error',
|
|
160
|
+
message: 'Missing mcp module import'
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Check for Server instantiation
|
|
165
|
+
if (!content.includes('Server(')) {
|
|
166
|
+
issues.push({
|
|
167
|
+
severity: 'error',
|
|
168
|
+
message: 'Missing Server instantiation'
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Check for list_tools decorator
|
|
173
|
+
if (!content.includes('@server.list_tools') && !content.includes('list_tools')) {
|
|
174
|
+
issues.push({
|
|
175
|
+
severity: 'warning',
|
|
176
|
+
message: 'Missing list_tools handler'
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Check for call_tool decorator
|
|
181
|
+
if (!content.includes('@server.call_tool') && !content.includes('call_tool')) {
|
|
182
|
+
issues.push({
|
|
183
|
+
severity: 'warning',
|
|
184
|
+
message: 'Missing call_tool handler'
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Check for async main
|
|
189
|
+
if (!content.includes('async def main') && !content.includes('asyncio.run')) {
|
|
190
|
+
issues.push({
|
|
191
|
+
severity: 'warning',
|
|
192
|
+
message: 'Missing async main function or asyncio.run'
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return issues;
|
|
197
|
+
}
|