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,208 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Registry updater for checking and updating entries
|
|
3
|
+
* @copyright Copyright (c) 2024-2026 nirholas
|
|
4
|
+
* @license Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
RegistryEntry,
|
|
9
|
+
UpdateInfo,
|
|
10
|
+
StorageAdapter,
|
|
11
|
+
} from './types';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Options for the updater
|
|
15
|
+
*/
|
|
16
|
+
export interface UpdaterOptions {
|
|
17
|
+
/** GitHub token for API requests */
|
|
18
|
+
githubToken?: string;
|
|
19
|
+
/** Whether to auto-update entries */
|
|
20
|
+
autoUpdate?: boolean;
|
|
21
|
+
/** Check interval in milliseconds */
|
|
22
|
+
checkInterval?: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Registry updater - checks for updates from source repos
|
|
27
|
+
*/
|
|
28
|
+
export class RegistryUpdater {
|
|
29
|
+
private storage: StorageAdapter;
|
|
30
|
+
private options: UpdaterOptions;
|
|
31
|
+
|
|
32
|
+
constructor(storage: StorageAdapter, options: UpdaterOptions = {}) {
|
|
33
|
+
this.storage = storage;
|
|
34
|
+
this.options = options;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check if an entry has updates available
|
|
39
|
+
*/
|
|
40
|
+
async checkForUpdates(id: string): Promise<UpdateInfo | null> {
|
|
41
|
+
const entry = await this.storage.get(id);
|
|
42
|
+
if (!entry) return null;
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const latestVersion = await this.getLatestSourceVersion(entry.sourceRepo);
|
|
46
|
+
|
|
47
|
+
if (latestVersion && latestVersion !== entry.sourceVersion) {
|
|
48
|
+
return {
|
|
49
|
+
id: entry.id,
|
|
50
|
+
currentVersion: entry.version,
|
|
51
|
+
latestVersion: this.incrementVersion(entry.version),
|
|
52
|
+
changelog: `Updated from ${entry.sourceVersion} to ${latestVersion}`,
|
|
53
|
+
breaking: this.isBreakingUpdate(entry.sourceVersion, latestVersion),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return null;
|
|
58
|
+
} catch {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Check all entries for updates
|
|
65
|
+
*/
|
|
66
|
+
async checkAllForUpdates(): Promise<UpdateInfo[]> {
|
|
67
|
+
const updates: UpdateInfo[] = [];
|
|
68
|
+
const result = await this.storage.list({ limit: 1000 });
|
|
69
|
+
|
|
70
|
+
for (const summary of result.entries) {
|
|
71
|
+
const update = await this.checkForUpdates(summary.id);
|
|
72
|
+
if (update) {
|
|
73
|
+
updates.push(update);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return updates;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get the latest version/commit from source repo
|
|
82
|
+
*/
|
|
83
|
+
private async getLatestSourceVersion(sourceRepo: string): Promise<string | null> {
|
|
84
|
+
const [owner, repo] = sourceRepo.split('/');
|
|
85
|
+
if (!owner || !repo) return null;
|
|
86
|
+
|
|
87
|
+
const headers: Record<string, string> = {
|
|
88
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
89
|
+
'User-Agent': 'github-to-mcp-registry',
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
if (this.options.githubToken) {
|
|
93
|
+
headers['Authorization'] = `Bearer ${this.options.githubToken}`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
try {
|
|
97
|
+
// Try to get latest release first
|
|
98
|
+
const releaseResponse = await fetch(
|
|
99
|
+
`https://api.github.com/repos/${owner}/${repo}/releases/latest`,
|
|
100
|
+
{ headers }
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
if (releaseResponse.ok) {
|
|
104
|
+
const release = await releaseResponse.json() as { tag_name: string };
|
|
105
|
+
return release.tag_name;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Fall back to latest commit on default branch
|
|
109
|
+
const commitResponse = await fetch(
|
|
110
|
+
`https://api.github.com/repos/${owner}/${repo}/commits?per_page=1`,
|
|
111
|
+
{ headers }
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
if (commitResponse.ok) {
|
|
115
|
+
const commits = await commitResponse.json() as Array<{ sha: string }>;
|
|
116
|
+
if (commits.length > 0) {
|
|
117
|
+
return commits[0].sha.substring(0, 7);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return null;
|
|
122
|
+
} catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Increment a semver version
|
|
129
|
+
*/
|
|
130
|
+
private incrementVersion(version: string): string {
|
|
131
|
+
const parts = version.split('.');
|
|
132
|
+
if (parts.length === 3) {
|
|
133
|
+
const patch = parseInt(parts[2], 10) || 0;
|
|
134
|
+
return `${parts[0]}.${parts[1]}.${patch + 1}`;
|
|
135
|
+
}
|
|
136
|
+
return `${version}.1`;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Check if an update is a breaking change
|
|
141
|
+
* (Simple heuristic based on major version)
|
|
142
|
+
*/
|
|
143
|
+
private isBreakingUpdate(oldVersion: string, newVersion: string): boolean {
|
|
144
|
+
const oldMajor = this.extractMajorVersion(oldVersion);
|
|
145
|
+
const newMajor = this.extractMajorVersion(newVersion);
|
|
146
|
+
return newMajor > oldMajor;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Extract major version number
|
|
151
|
+
*/
|
|
152
|
+
private extractMajorVersion(version: string): number {
|
|
153
|
+
const match = version.match(/^v?(\d+)/);
|
|
154
|
+
return match ? parseInt(match[1], 10) : 0;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Update an entry from its source repo
|
|
159
|
+
* Requires the core generator to be available
|
|
160
|
+
*/
|
|
161
|
+
async updateEntry(
|
|
162
|
+
id: string,
|
|
163
|
+
generator?: { generate: (url: string) => Promise<unknown> }
|
|
164
|
+
): Promise<RegistryEntry | null> {
|
|
165
|
+
const entry = await this.storage.get(id);
|
|
166
|
+
if (!entry) return null;
|
|
167
|
+
|
|
168
|
+
if (!generator) {
|
|
169
|
+
console.warn('Generator not provided, cannot regenerate entry');
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
try {
|
|
174
|
+
// Regenerate from source
|
|
175
|
+
const result = await generator.generate(entry.sourceUrl) as {
|
|
176
|
+
tools: Array<{ name: string; description: string; source: { type: string }; inputSchema: { properties: object } }>;
|
|
177
|
+
generate: () => string;
|
|
178
|
+
generatePython?: () => string;
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
// Update entry
|
|
182
|
+
const updatedEntry: RegistryEntry = {
|
|
183
|
+
...entry,
|
|
184
|
+
version: this.incrementVersion(entry.version),
|
|
185
|
+
sourceVersion: await this.getLatestSourceVersion(entry.sourceRepo) || entry.sourceVersion,
|
|
186
|
+
toolCount: result.tools.length,
|
|
187
|
+
tools: result.tools.map(t => ({
|
|
188
|
+
name: t.name,
|
|
189
|
+
description: t.description,
|
|
190
|
+
source: t.source.type,
|
|
191
|
+
paramCount: Object.keys(t.inputSchema?.properties || {}).length,
|
|
192
|
+
requiresAuth: entry.auth.length > 0,
|
|
193
|
+
})),
|
|
194
|
+
generatedCode: {
|
|
195
|
+
typescript: result.generate(),
|
|
196
|
+
python: result.generatePython?.(),
|
|
197
|
+
},
|
|
198
|
+
lastUpdated: new Date().toISOString(),
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
await this.storage.save(updatedEntry);
|
|
202
|
+
return updatedEntry;
|
|
203
|
+
} catch (error) {
|
|
204
|
+
console.error(`Failed to update entry ${id}:`, error);
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Build MkDocs and copy to Next.js public folder
|
|
3
|
+
|
|
4
|
+
set -e
|
|
5
|
+
|
|
6
|
+
echo "Building MkDocs documentation..."
|
|
7
|
+
|
|
8
|
+
# Install MkDocs dependencies
|
|
9
|
+
pip install -q -r mkdocs/requirements.txt
|
|
10
|
+
|
|
11
|
+
# Build MkDocs to static HTML
|
|
12
|
+
cd mkdocs
|
|
13
|
+
mkdocs build --site-dir ../apps/web/public/docs
|
|
14
|
+
cd ..
|
|
15
|
+
|
|
16
|
+
echo "✓ MkDocs built to apps/web/public/docs"
|
package/server.json
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
|
+
"name": "io.github.nirholas/github-to-mcp",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"title": "GitHub to MCP Converter",
|
|
6
|
+
"description": "Convert any GitHub repo to MCP server - automatic tool generation API wrap",
|
|
7
|
+
"keywords": ["github", "mcp", "converter", "generator", "api", "tools"],
|
|
8
|
+
"repository": {"url": "https://github.com/nirholas/github-to-mcp", "source": "github"}
|
|
9
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Auto-generated Dockerfile for {{name}} MCP Server (Python)
|
|
2
|
+
# Generated by @nirholas/github-to-mcp
|
|
3
|
+
|
|
4
|
+
# Build stage
|
|
5
|
+
FROM python:3.11-slim AS builder
|
|
6
|
+
|
|
7
|
+
WORKDIR /app
|
|
8
|
+
|
|
9
|
+
# Install system dependencies
|
|
10
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
11
|
+
build-essential \
|
|
12
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
13
|
+
|
|
14
|
+
# Install Python dependencies
|
|
15
|
+
COPY requirements.txt ./
|
|
16
|
+
RUN pip install --no-cache-dir --user -r requirements.txt
|
|
17
|
+
|
|
18
|
+
# Production stage
|
|
19
|
+
FROM python:3.11-slim AS production
|
|
20
|
+
|
|
21
|
+
WORKDIR /app
|
|
22
|
+
|
|
23
|
+
# Create non-root user
|
|
24
|
+
RUN useradd -m -u 1001 mcpserver
|
|
25
|
+
|
|
26
|
+
# Copy Python packages from builder
|
|
27
|
+
COPY --from=builder /root/.local /home/mcpserver/.local
|
|
28
|
+
|
|
29
|
+
# Copy source code
|
|
30
|
+
COPY . .
|
|
31
|
+
|
|
32
|
+
# Change ownership
|
|
33
|
+
RUN chown -R mcpserver:mcpserver /app
|
|
34
|
+
|
|
35
|
+
LABEL org.opencontainers.image.title="{{name}}-mcp-server"
|
|
36
|
+
LABEL org.opencontainers.image.description="{{description}}"
|
|
37
|
+
LABEL org.opencontainers.image.source="https://github.com/{{repo}}"
|
|
38
|
+
LABEL maintainer="Generated by @nirholas/github-to-mcp"
|
|
39
|
+
|
|
40
|
+
# Set production environment
|
|
41
|
+
ENV PYTHONUNBUFFERED=1
|
|
42
|
+
ENV PYTHONDONTWRITEBYTECODE=1
|
|
43
|
+
ENV PATH=/home/mcpserver/.local/bin:$PATH
|
|
44
|
+
ENV PORT={{port}}
|
|
45
|
+
|
|
46
|
+
# Expose port
|
|
47
|
+
EXPOSE {{port}}
|
|
48
|
+
|
|
49
|
+
# Health check
|
|
50
|
+
HEALTHCHECK --interval=30s \
|
|
51
|
+
--timeout=10s \
|
|
52
|
+
--start-period=5s \
|
|
53
|
+
--retries=3 \
|
|
54
|
+
CMD python -c "import sys; sys.exit(0)"
|
|
55
|
+
|
|
56
|
+
# Switch to non-root user
|
|
57
|
+
USER mcpserver
|
|
58
|
+
|
|
59
|
+
# Start the MCP server
|
|
60
|
+
CMD ["python", "-m", "mcp_server"]
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Auto-generated Dockerfile for {{name}} MCP Server
|
|
2
|
+
# Generated by @nirholas/github-to-mcp
|
|
3
|
+
|
|
4
|
+
# Build stage
|
|
5
|
+
FROM node:20-alpine AS builder
|
|
6
|
+
|
|
7
|
+
WORKDIR /app
|
|
8
|
+
|
|
9
|
+
# Install dependencies
|
|
10
|
+
COPY package*.json ./
|
|
11
|
+
COPY pnpm-lock.yaml* ./
|
|
12
|
+
|
|
13
|
+
# Use pnpm if available, fallback to npm
|
|
14
|
+
RUN corepack enable pnpm 2>/dev/null || npm install -g pnpm
|
|
15
|
+
RUN pnpm install --frozen-lockfile || npm ci
|
|
16
|
+
|
|
17
|
+
# Copy source code
|
|
18
|
+
COPY . .
|
|
19
|
+
|
|
20
|
+
# Build TypeScript
|
|
21
|
+
RUN pnpm build || npm run build
|
|
22
|
+
|
|
23
|
+
# Production stage
|
|
24
|
+
FROM node:20-alpine AS production
|
|
25
|
+
|
|
26
|
+
WORKDIR /app
|
|
27
|
+
|
|
28
|
+
# Create non-root user
|
|
29
|
+
RUN addgroup -g 1001 -S nodejs && \
|
|
30
|
+
adduser -S mcpserver -u 1001
|
|
31
|
+
|
|
32
|
+
# Copy built files and dependencies
|
|
33
|
+
COPY --from=builder /app/dist ./dist
|
|
34
|
+
COPY --from=builder /app/node_modules ./node_modules
|
|
35
|
+
COPY --from=builder /app/package.json ./
|
|
36
|
+
|
|
37
|
+
LABEL org.opencontainers.image.title="{{name}}-mcp-server"
|
|
38
|
+
LABEL org.opencontainers.image.description="{{description}}"
|
|
39
|
+
LABEL org.opencontainers.image.source="https://github.com/{{repo}}"
|
|
40
|
+
LABEL maintainer="Generated by @nirholas/github-to-mcp"
|
|
41
|
+
|
|
42
|
+
# Set production environment
|
|
43
|
+
ENV NODE_ENV=production
|
|
44
|
+
ENV PORT={{port}}
|
|
45
|
+
|
|
46
|
+
# Expose port
|
|
47
|
+
EXPOSE {{port}}
|
|
48
|
+
|
|
49
|
+
# Health check
|
|
50
|
+
HEALTHCHECK --interval=30s \
|
|
51
|
+
--timeout=10s \
|
|
52
|
+
--start-period=5s \
|
|
53
|
+
--retries=3 \
|
|
54
|
+
CMD node -e "process.exit(0)"
|
|
55
|
+
|
|
56
|
+
# Switch to non-root user
|
|
57
|
+
USER mcpserver
|
|
58
|
+
|
|
59
|
+
# Start the MCP server
|
|
60
|
+
CMD ["node", "dist/index.js"]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Auto-generated Docker Compose for {{name}} MCP Server
|
|
2
|
+
# Generated by @nirholas/github-to-mcp
|
|
3
|
+
|
|
4
|
+
version: '3.8'
|
|
5
|
+
|
|
6
|
+
services:
|
|
7
|
+
{{serviceName}}:
|
|
8
|
+
build:
|
|
9
|
+
context: .
|
|
10
|
+
dockerfile: Dockerfile
|
|
11
|
+
container_name: {{serviceName}}-mcp
|
|
12
|
+
restart: unless-stopped
|
|
13
|
+
ports:
|
|
14
|
+
- "{{port}}:{{port}}"
|
|
15
|
+
environment:
|
|
16
|
+
NODE_ENV: "production"
|
|
17
|
+
PORT: "{{port}}"
|
|
18
|
+
{{#if redisEnabled}}
|
|
19
|
+
REDIS_URL: "redis://redis:6379"
|
|
20
|
+
{{/if}}
|
|
21
|
+
{{#if volumes}}
|
|
22
|
+
volumes:
|
|
23
|
+
{{#each volumes}}
|
|
24
|
+
- {{this}}
|
|
25
|
+
{{/each}}
|
|
26
|
+
{{/if}}
|
|
27
|
+
{{#if dependsOn}}
|
|
28
|
+
depends_on:
|
|
29
|
+
{{#each dependsOn}}
|
|
30
|
+
- {{this}}
|
|
31
|
+
{{/each}}
|
|
32
|
+
{{/if}}
|
|
33
|
+
networks:
|
|
34
|
+
- mcp-network
|
|
35
|
+
healthcheck:
|
|
36
|
+
test: ["CMD", "node", "-e", "process.exit(0)"]
|
|
37
|
+
interval: 30s
|
|
38
|
+
timeout: 10s
|
|
39
|
+
retries: 3
|
|
40
|
+
start_period: 10s
|
|
41
|
+
|
|
42
|
+
{{#if redisEnabled}}
|
|
43
|
+
redis:
|
|
44
|
+
image: redis:7-alpine
|
|
45
|
+
container_name: {{serviceName}}-redis
|
|
46
|
+
restart: unless-stopped
|
|
47
|
+
ports:
|
|
48
|
+
- "6379:6379"
|
|
49
|
+
volumes:
|
|
50
|
+
- redis-data:/data
|
|
51
|
+
networks:
|
|
52
|
+
- mcp-network
|
|
53
|
+
healthcheck:
|
|
54
|
+
test: ["CMD", "redis-cli", "ping"]
|
|
55
|
+
interval: 10s
|
|
56
|
+
timeout: 5s
|
|
57
|
+
retries: 5
|
|
58
|
+
{{/if}}
|
|
59
|
+
|
|
60
|
+
networks:
|
|
61
|
+
mcp-network:
|
|
62
|
+
driver: bridge
|
|
63
|
+
|
|
64
|
+
volumes:
|
|
65
|
+
{{serviceName}}-data:
|
|
66
|
+
{{#if redisEnabled}}
|
|
67
|
+
redis-data:
|
|
68
|
+
{{/if}}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sample Express.js application for testing
|
|
3
|
+
*/
|
|
4
|
+
const express = require('express');
|
|
5
|
+
const app = express();
|
|
6
|
+
const usersRouter = require('./routes/users');
|
|
7
|
+
const postsRouter = require('./routes/posts');
|
|
8
|
+
|
|
9
|
+
app.use(express.json());
|
|
10
|
+
|
|
11
|
+
// API routes
|
|
12
|
+
app.use('/api', usersRouter);
|
|
13
|
+
app.use('/api', postsRouter);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Health check endpoint
|
|
17
|
+
* @tag System
|
|
18
|
+
*/
|
|
19
|
+
app.get('/health', (req, res) => {
|
|
20
|
+
res.json({ status: 'ok' });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* API info endpoint
|
|
25
|
+
* @tag System
|
|
26
|
+
*/
|
|
27
|
+
app.get('/api/info', (req, res) => {
|
|
28
|
+
res.json({
|
|
29
|
+
name: 'Test API',
|
|
30
|
+
version: '1.0.0',
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
module.exports = app;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Posts routes for testing
|
|
3
|
+
*/
|
|
4
|
+
const express = require('express');
|
|
5
|
+
const router = express.Router();
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Get all posts with pagination
|
|
9
|
+
* @tag Posts
|
|
10
|
+
* @param {number} req.query.page - Page number
|
|
11
|
+
* @param {number} req.query.limit - Items per page
|
|
12
|
+
*/
|
|
13
|
+
router.get('/posts', (req, res) => {
|
|
14
|
+
const { page = 1, limit = 10 } = req.query;
|
|
15
|
+
res.json({ posts: [], page, limit, total: 0 });
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Get post by ID
|
|
20
|
+
* @tag Posts
|
|
21
|
+
*/
|
|
22
|
+
router.get('/posts/:postId', (req, res) => {
|
|
23
|
+
res.json({ id: req.params.postId, title: 'Test Post' });
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Create post
|
|
28
|
+
* @tag Posts
|
|
29
|
+
*/
|
|
30
|
+
router.post('/posts', (req, res) => {
|
|
31
|
+
res.status(201).json({ id: '456', ...req.body });
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Get comments for a post
|
|
36
|
+
* @tag Posts
|
|
37
|
+
* @tag Comments
|
|
38
|
+
*/
|
|
39
|
+
router.get('/posts/:postId/comments', (req, res) => {
|
|
40
|
+
res.json({ comments: [] });
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
module.exports = router;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sample Express.js application for testing
|
|
3
|
+
*/
|
|
4
|
+
const express = require('express');
|
|
5
|
+
const router = express.Router();
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Get all users
|
|
9
|
+
* @tag Users
|
|
10
|
+
* @returns {array} List of users
|
|
11
|
+
*/
|
|
12
|
+
router.get('/users', (req, res) => {
|
|
13
|
+
const { limit, offset } = req.query;
|
|
14
|
+
res.json({ users: [], limit, offset });
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Get user by ID
|
|
19
|
+
* @tag Users
|
|
20
|
+
* @param {string} req.params.id - User ID
|
|
21
|
+
* @returns {object} User object
|
|
22
|
+
*/
|
|
23
|
+
router.get('/users/:id', (req, res) => {
|
|
24
|
+
const { id } = req.params;
|
|
25
|
+
res.json({ id, name: 'Test User' });
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Create a new user
|
|
30
|
+
* @tag Users
|
|
31
|
+
* @body {object} User data
|
|
32
|
+
* @returns {object} Created user
|
|
33
|
+
*/
|
|
34
|
+
router.post('/users', (req, res) => {
|
|
35
|
+
const userData = req.body;
|
|
36
|
+
res.status(201).json({ id: '123', ...userData });
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Update user
|
|
41
|
+
* @tag Users
|
|
42
|
+
* @deprecated
|
|
43
|
+
*/
|
|
44
|
+
router.put('/users/:id', (req, res) => {
|
|
45
|
+
const { id } = req.params;
|
|
46
|
+
const userData = req.body;
|
|
47
|
+
res.json({ id, ...userData });
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Delete user
|
|
52
|
+
* @tag Users
|
|
53
|
+
*/
|
|
54
|
+
router.delete('/users/:id', (req, res) => {
|
|
55
|
+
res.status(204).send();
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
module.exports = router;
|