@structured-world/gitlab-mcp 6.62.1 → 6.62.2
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/README.md +1 -1
- package/dist/generated/prisma/client.js.map +1 -1
- package/dist/generated/prisma/internal/class.js +2 -2
- package/dist/generated/prisma/internal/class.js.map +1 -1
- package/dist/generated/prisma/internal/prismaNamespace.js +2 -2
- package/dist/src/cli/docker/container-runtime.d.ts +1 -1
- package/dist/src/cli/docker/container-runtime.js +14 -14
- package/dist/src/cli/docker/docker-command.d.ts +1 -1
- package/dist/src/cli/docker/docker-command.js +113 -113
- package/dist/src/cli/docker/docker-command.js.map +1 -1
- package/dist/src/cli/docker/docker-utils.d.ts +3 -3
- package/dist/src/cli/docker/docker-utils.js +74 -74
- package/dist/src/cli/docker/docker-utils.js.map +1 -1
- package/dist/src/cli/docker/index.d.ts +4 -4
- package/dist/src/cli/docker/types.d.ts +3 -3
- package/dist/src/cli/docker/types.js +5 -5
- package/dist/src/cli/init/browser.js +2 -2
- package/dist/src/cli/init/config-generator.d.ts +2 -2
- package/dist/src/cli/init/config-generator.js +22 -22
- package/dist/src/cli/init/connection.d.ts +1 -1
- package/dist/src/cli/init/connection.js +17 -17
- package/dist/src/cli/init/index.d.ts +4 -4
- package/dist/src/cli/init/types.d.ts +3 -3
- package/dist/src/cli/init/types.js +36 -36
- package/dist/src/cli/init/wizard.js +80 -80
- package/dist/src/cli/init/wizard.js.map +1 -1
- package/dist/src/cli/inject-tool-refs.js +47 -47
- package/dist/src/cli/inject-tool-refs.js.map +1 -1
- package/dist/src/cli/install/backup.d.ts +1 -1
- package/dist/src/cli/install/backup.js +3 -3
- package/dist/src/cli/install/detector.d.ts +2 -2
- package/dist/src/cli/install/detector.js +18 -18
- package/dist/src/cli/install/detector.js.map +1 -1
- package/dist/src/cli/install/index.d.ts +5 -5
- package/dist/src/cli/install/install-command.d.ts +2 -2
- package/dist/src/cli/install/install-command.js +68 -68
- package/dist/src/cli/install/install-command.js.map +1 -1
- package/dist/src/cli/install/installers.d.ts +2 -2
- package/dist/src/cli/install/installers.js +55 -55
- package/dist/src/cli/install/installers.js.map +1 -1
- package/dist/src/cli/install/types.d.ts +4 -4
- package/dist/src/cli/install/types.js +48 -48
- package/dist/src/cli/instances/index.d.ts +2 -2
- package/dist/src/cli/instances/instances-command.d.ts +1 -1
- package/dist/src/cli/instances/instances-command.js +65 -65
- package/dist/src/cli/instances/instances-command.js.map +1 -1
- package/dist/src/cli/list-tools.js +396 -396
- package/dist/src/cli/list-tools.js.map +1 -1
- package/dist/src/cli/setup/discovery.d.ts +1 -1
- package/dist/src/cli/setup/discovery.js +10 -10
- package/dist/src/cli/setup/discovery.js.map +1 -1
- package/dist/src/cli/setup/flows/configure-existing.d.ts +1 -1
- package/dist/src/cli/setup/flows/configure-existing.js +57 -57
- package/dist/src/cli/setup/flows/configure-existing.js.map +1 -1
- package/dist/src/cli/setup/flows/local-setup.d.ts +1 -1
- package/dist/src/cli/setup/flows/local-setup.js +51 -51
- package/dist/src/cli/setup/flows/local-setup.js.map +1 -1
- package/dist/src/cli/setup/flows/server-setup.d.ts +1 -1
- package/dist/src/cli/setup/flows/server-setup.js +50 -50
- package/dist/src/cli/setup/flows/server-setup.js.map +1 -1
- package/dist/src/cli/setup/flows/tool-selection.d.ts +1 -1
- package/dist/src/cli/setup/flows/tool-selection.js +94 -94
- package/dist/src/cli/setup/flows/tool-selection.js.map +1 -1
- package/dist/src/cli/setup/index.d.ts +4 -4
- package/dist/src/cli/setup/presets.d.ts +1 -1
- package/dist/src/cli/setup/presets.js +157 -157
- package/dist/src/cli/setup/presets.js.map +1 -1
- package/dist/src/cli/setup/types.d.ts +7 -7
- package/dist/src/cli/setup/wizard.d.ts +1 -1
- package/dist/src/cli/setup/wizard.js +25 -25
- package/dist/src/cli/utils/index.d.ts +1 -1
- package/dist/src/cli/utils/path-utils.js +3 -3
- package/dist/src/cli-utils.d.ts +2 -2
- package/dist/src/cli-utils.js +46 -46
- package/dist/src/config/index.d.ts +4 -4
- package/dist/src/config/instances-loader.d.ts +3 -3
- package/dist/src/config/instances-loader.js +53 -53
- package/dist/src/config/instances-loader.js.map +1 -1
- package/dist/src/config/instances-schema.d.ts +1 -1
- package/dist/src/config/instances-schema.js +33 -33
- package/dist/src/config/instances-schema.js.map +1 -1
- package/dist/src/config.d.ts +4 -4
- package/dist/src/config.js +89 -89
- package/dist/src/config.js.map +1 -1
- package/dist/src/dashboard/handler.d.ts +2 -2
- package/dist/src/dashboard/handler.js +7 -7
- package/dist/src/dashboard/html-template.d.ts +1 -1
- package/dist/src/dashboard/html-template.js +44 -44
- package/dist/src/dashboard/html-template.js.map +1 -1
- package/dist/src/dashboard/index.d.ts +4 -4
- package/dist/src/dashboard/metrics.d.ts +3 -3
- package/dist/src/dashboard/metrics.js +42 -42
- package/dist/src/discovery/auto.d.ts +3 -3
- package/dist/src/discovery/auto.js +28 -28
- package/dist/src/discovery/git-remote.d.ts +2 -2
- package/dist/src/discovery/git-remote.js +18 -18
- package/dist/src/discovery/index.d.ts +3 -3
- package/dist/src/discovery/profile-matcher.d.ts +2 -2
- package/dist/src/discovery/profile-matcher.js +8 -8
- package/dist/src/discovery/profile-matcher.js.map +1 -1
- package/dist/src/entities/context/context-manager.d.ts +3 -3
- package/dist/src/entities/context/context-manager.js +34 -34
- package/dist/src/entities/context/context-manager.js.map +1 -1
- package/dist/src/entities/context/handlers.d.ts +2 -2
- package/dist/src/entities/context/handlers.js +8 -8
- package/dist/src/entities/context/index.d.ts +8 -8
- package/dist/src/entities/context/index.js +1 -1
- package/dist/src/entities/context/registry.d.ts +1 -1
- package/dist/src/entities/context/registry.js +4 -4
- package/dist/src/entities/context/schema.d.ts +1 -1
- package/dist/src/entities/context/schema.js +19 -19
- package/dist/src/entities/context/types.d.ts +9 -9
- package/dist/src/entities/context/whoami.d.ts +1 -1
- package/dist/src/entities/context/whoami.js +31 -31
- package/dist/src/entities/context/whoami.js.map +1 -1
- package/dist/src/entities/core/index.d.ts +5 -5
- package/dist/src/entities/core/index.js +1 -1
- package/dist/src/entities/core/registry.d.ts +1 -1
- package/dist/src/entities/core/registry.js +194 -194
- package/dist/src/entities/core/registry.js.map +1 -1
- package/dist/src/entities/core/schema-readonly.d.ts +1 -1
- package/dist/src/entities/core/schema-readonly.js +117 -117
- package/dist/src/entities/core/schema.d.ts +1 -1
- package/dist/src/entities/core/schema.js +67 -67
- package/dist/src/entities/files/index.d.ts +5 -5
- package/dist/src/entities/files/index.js +1 -1
- package/dist/src/entities/files/registry.d.ts +1 -1
- package/dist/src/entities/files/registry.js +45 -45
- package/dist/src/entities/files/registry.js.map +1 -1
- package/dist/src/entities/files/schema-readonly.d.ts +1 -1
- package/dist/src/entities/files/schema-readonly.js +13 -13
- package/dist/src/entities/files/schema.d.ts +1 -1
- package/dist/src/entities/files/schema.js +29 -29
- package/dist/src/entities/index.d.ts +17 -17
- package/dist/src/entities/integrations/index.d.ts +4 -4
- package/dist/src/entities/integrations/registry.d.ts +1 -1
- package/dist/src/entities/integrations/registry.js +17 -17
- package/dist/src/entities/integrations/registry.js.map +1 -1
- package/dist/src/entities/integrations/schema-readonly.d.ts +1 -1
- package/dist/src/entities/integrations/schema-readonly.js +5 -5
- package/dist/src/entities/integrations/schema.d.ts +1 -1
- package/dist/src/entities/integrations/schema.js +69 -69
- package/dist/src/entities/iterations/index.d.ts +2 -2
- package/dist/src/entities/iterations/registry.d.ts +1 -1
- package/dist/src/entities/iterations/registry.js +13 -13
- package/dist/src/entities/iterations/registry.js.map +1 -1
- package/dist/src/entities/iterations/schema-readonly.d.ts +1 -1
- package/dist/src/entities/iterations/schema-readonly.js +9 -9
- package/dist/src/entities/labels/index.d.ts +5 -5
- package/dist/src/entities/labels/index.js +1 -1
- package/dist/src/entities/labels/registry.d.ts +1 -1
- package/dist/src/entities/labels/registry.js +19 -19
- package/dist/src/entities/labels/registry.js.map +1 -1
- package/dist/src/entities/labels/schema-readonly.d.ts +1 -1
- package/dist/src/entities/labels/schema-readonly.js +8 -8
- package/dist/src/entities/labels/schema.d.ts +1 -1
- package/dist/src/entities/labels/schema.js +11 -11
- package/dist/src/entities/members/index.d.ts +3 -3
- package/dist/src/entities/members/registry.d.ts +1 -1
- package/dist/src/entities/members/registry.js +26 -26
- package/dist/src/entities/members/registry.js.map +1 -1
- package/dist/src/entities/members/schema-readonly.d.ts +1 -1
- package/dist/src/entities/members/schema-readonly.js +32 -32
- package/dist/src/entities/members/schema-readonly.js.map +1 -1
- package/dist/src/entities/members/schema.d.ts +1 -1
- package/dist/src/entities/members/schema.js +28 -28
- package/dist/src/entities/milestones/index.d.ts +5 -5
- package/dist/src/entities/milestones/index.js +1 -1
- package/dist/src/entities/milestones/registry.d.ts +1 -1
- package/dist/src/entities/milestones/registry.js +25 -25
- package/dist/src/entities/milestones/registry.js.map +1 -1
- package/dist/src/entities/milestones/schema-readonly.d.ts +2 -2
- package/dist/src/entities/milestones/schema-readonly.js +15 -15
- package/dist/src/entities/milestones/schema.d.ts +1 -1
- package/dist/src/entities/milestones/schema.js +16 -16
- package/dist/src/entities/milestones/schema.js.map +1 -1
- package/dist/src/entities/mrs/index.d.ts +5 -5
- package/dist/src/entities/mrs/index.js +1 -1
- package/dist/src/entities/mrs/registry.d.ts +1 -1
- package/dist/src/entities/mrs/registry.js +102 -102
- package/dist/src/entities/mrs/registry.js.map +1 -1
- package/dist/src/entities/mrs/schema-readonly.d.ts +1 -1
- package/dist/src/entities/mrs/schema-readonly.js +126 -126
- package/dist/src/entities/mrs/schema-readonly.js.map +1 -1
- package/dist/src/entities/mrs/schema.d.ts +1 -1
- package/dist/src/entities/mrs/schema.js +111 -111
- package/dist/src/entities/mrs/schema.js.map +1 -1
- package/dist/src/entities/pipelines/index.d.ts +5 -5
- package/dist/src/entities/pipelines/index.js +1 -1
- package/dist/src/entities/pipelines/registry.d.ts +1 -1
- package/dist/src/entities/pipelines/registry.js +45 -45
- package/dist/src/entities/pipelines/registry.js.map +1 -1
- package/dist/src/entities/pipelines/schema-readonly.d.ts +1 -1
- package/dist/src/entities/pipelines/schema-readonly.js +73 -73
- package/dist/src/entities/pipelines/schema.d.ts +1 -1
- package/dist/src/entities/pipelines/schema.js +21 -21
- package/dist/src/entities/refs/index.d.ts +3 -3
- package/dist/src/entities/refs/registry.d.ts +1 -1
- package/dist/src/entities/refs/registry.js +31 -31
- package/dist/src/entities/refs/registry.js.map +1 -1
- package/dist/src/entities/refs/schema-readonly.d.ts +1 -1
- package/dist/src/entities/refs/schema-readonly.js +21 -21
- package/dist/src/entities/refs/schema.d.ts +1 -1
- package/dist/src/entities/refs/schema.js +56 -56
- package/dist/src/entities/releases/index.d.ts +3 -3
- package/dist/src/entities/releases/registry.d.ts +1 -1
- package/dist/src/entities/releases/registry.js +21 -21
- package/dist/src/entities/releases/registry.js.map +1 -1
- package/dist/src/entities/releases/schema-readonly.d.ts +1 -1
- package/dist/src/entities/releases/schema-readonly.js +13 -13
- package/dist/src/entities/releases/schema.d.ts +1 -1
- package/dist/src/entities/releases/schema.js +21 -21
- package/dist/src/entities/search/index.d.ts +2 -2
- package/dist/src/entities/search/registry.d.ts +1 -1
- package/dist/src/entities/search/registry.js +13 -13
- package/dist/src/entities/search/schema-readonly.d.ts +1 -1
- package/dist/src/entities/search/schema-readonly.js +23 -23
- package/dist/src/entities/shared.d.ts +1 -1
- package/dist/src/entities/shared.js +5 -5
- package/dist/src/entities/snippets/index.d.ts +5 -5
- package/dist/src/entities/snippets/index.js +1 -1
- package/dist/src/entities/snippets/registry.d.ts +1 -1
- package/dist/src/entities/snippets/registry.js +24 -24
- package/dist/src/entities/snippets/registry.js.map +1 -1
- package/dist/src/entities/snippets/schema-readonly.d.ts +1 -1
- package/dist/src/entities/snippets/schema-readonly.js +11 -11
- package/dist/src/entities/snippets/schema.d.ts +1 -1
- package/dist/src/entities/snippets/schema.js +27 -27
- package/dist/src/entities/snippets/schema.js.map +1 -1
- package/dist/src/entities/utils.d.ts +2 -2
- package/dist/src/entities/utils.js +8 -8
- package/dist/src/entities/utils.js.map +1 -1
- package/dist/src/entities/variables/index.d.ts +5 -5
- package/dist/src/entities/variables/index.js +1 -1
- package/dist/src/entities/variables/registry.d.ts +1 -1
- package/dist/src/entities/variables/registry.js +22 -22
- package/dist/src/entities/variables/registry.js.map +1 -1
- package/dist/src/entities/variables/schema-readonly.d.ts +1 -1
- package/dist/src/entities/variables/schema-readonly.js +6 -6
- package/dist/src/entities/variables/schema.d.ts +1 -1
- package/dist/src/entities/variables/schema.js +21 -21
- package/dist/src/entities/variables/schema.js.map +1 -1
- package/dist/src/entities/webhooks/index.d.ts +4 -4
- package/dist/src/entities/webhooks/registry.d.ts +1 -1
- package/dist/src/entities/webhooks/registry.js +29 -29
- package/dist/src/entities/webhooks/registry.js.map +1 -1
- package/dist/src/entities/webhooks/schema-readonly.d.ts +1 -1
- package/dist/src/entities/webhooks/schema-readonly.js +9 -9
- package/dist/src/entities/webhooks/schema.d.ts +1 -1
- package/dist/src/entities/webhooks/schema.js +59 -59
- package/dist/src/entities/wiki/index.d.ts +5 -5
- package/dist/src/entities/wiki/index.js +1 -1
- package/dist/src/entities/wiki/registry.d.ts +1 -1
- package/dist/src/entities/wiki/registry.js +19 -19
- package/dist/src/entities/wiki/registry.js.map +1 -1
- package/dist/src/entities/wiki/schema-readonly.d.ts +1 -1
- package/dist/src/entities/wiki/schema-readonly.js +6 -6
- package/dist/src/entities/wiki/schema.d.ts +1 -1
- package/dist/src/entities/wiki/schema.js +12 -12
- package/dist/src/entities/workitems/index.d.ts +5 -5
- package/dist/src/entities/workitems/index.js +1 -1
- package/dist/src/entities/workitems/registry.d.ts +1 -1
- package/dist/src/entities/workitems/registry.js +101 -101
- package/dist/src/entities/workitems/registry.js.map +1 -1
- package/dist/src/entities/workitems/schema-readonly.d.ts +1 -1
- package/dist/src/entities/workitems/schema-readonly.js +27 -27
- package/dist/src/entities/workitems/schema-readonly.js.map +1 -1
- package/dist/src/entities/workitems/schema.d.ts +1 -1
- package/dist/src/entities/workitems/schema.js +58 -58
- package/dist/src/graphql/DynamicWorkItemsQuery.d.ts +2 -2
- package/dist/src/graphql/DynamicWorkItemsQuery.js +47 -47
- package/dist/src/graphql/DynamicWorkItemsQuery.js.map +1 -1
- package/dist/src/graphql/client.d.ts +1 -1
- package/dist/src/graphql/client.js +4 -4
- package/dist/src/graphql/client.js.map +1 -1
- package/dist/src/graphql/index.d.ts +2 -2
- package/dist/src/graphql/workItems.d.ts +38 -38
- package/dist/src/graphql/workItems.js +30 -30
- package/dist/src/handlers.d.ts +1 -1
- package/dist/src/handlers.js +55 -55
- package/dist/src/handlers.js.map +1 -1
- package/dist/src/http-client.js +3 -3
- package/dist/src/logger.js +25 -25
- package/dist/src/logging/access-log.d.ts +2 -2
- package/dist/src/logging/access-log.js +25 -25
- package/dist/src/logging/connection-tracker.d.ts +1 -1
- package/dist/src/logging/connection-tracker.js +3 -3
- package/dist/src/logging/index.d.ts +5 -5
- package/dist/src/logging/request-tracker.d.ts +3 -3
- package/dist/src/logging/request-tracker.js +4 -4
- package/dist/src/logging/types.d.ts +3 -3
- package/dist/src/logging/types.js +1 -1
- package/dist/src/main.js +28 -28
- package/dist/src/middleware/index.d.ts +2 -2
- package/dist/src/middleware/oauth-auth.d.ts +1 -1
- package/dist/src/middleware/oauth-auth.js +17 -17
- package/dist/src/middleware/rate-limiter.d.ts +1 -1
- package/dist/src/middleware/rate-limiter.js +32 -32
- package/dist/src/oauth/config.d.ts +1 -1
- package/dist/src/oauth/config.js +18 -18
- package/dist/src/oauth/config.js.map +1 -1
- package/dist/src/oauth/endpoints/authorize.d.ts +1 -1
- package/dist/src/oauth/endpoints/authorize.js +32 -32
- package/dist/src/oauth/endpoints/callback.d.ts +1 -1
- package/dist/src/oauth/endpoints/callback.js +26 -26
- package/dist/src/oauth/endpoints/index.d.ts +5 -5
- package/dist/src/oauth/endpoints/metadata.d.ts +1 -1
- package/dist/src/oauth/endpoints/metadata.js +12 -12
- package/dist/src/oauth/endpoints/register.d.ts +1 -1
- package/dist/src/oauth/endpoints/register.js +9 -9
- package/dist/src/oauth/endpoints/token.d.ts +1 -1
- package/dist/src/oauth/endpoints/token.js +28 -28
- package/dist/src/oauth/gitlab-device-flow.d.ts +2 -2
- package/dist/src/oauth/gitlab-device-flow.js +46 -46
- package/dist/src/oauth/gitlab-device-flow.js.map +1 -1
- package/dist/src/oauth/index.d.ts +10 -10
- package/dist/src/oauth/session-store.d.ts +2 -2
- package/dist/src/oauth/session-store.js +40 -40
- package/dist/src/oauth/session-store.js.map +1 -1
- package/dist/src/oauth/storage/factory.d.ts +2 -2
- package/dist/src/oauth/storage/factory.js +16 -16
- package/dist/src/oauth/storage/file.d.ts +2 -2
- package/dist/src/oauth/storage/file.js +22 -22
- package/dist/src/oauth/storage/file.js.map +1 -1
- package/dist/src/oauth/storage/index.d.ts +5 -5
- package/dist/src/oauth/storage/memory.d.ts +2 -2
- package/dist/src/oauth/storage/memory.js +18 -18
- package/dist/src/oauth/storage/memory.js.map +1 -1
- package/dist/src/oauth/storage/postgresql.d.ts +2 -2
- package/dist/src/oauth/storage/postgresql.js +11 -11
- package/dist/src/oauth/storage/postgresql.js.map +1 -1
- package/dist/src/oauth/storage/types.d.ts +3 -3
- package/dist/src/oauth/token-context.d.ts +1 -1
- package/dist/src/oauth/token-context.js +1 -1
- package/dist/src/oauth/token-utils.d.ts +1 -1
- package/dist/src/oauth/token-utils.js +20 -20
- package/dist/src/oauth/types.d.ts +3 -3
- package/dist/src/profiles/applicator.d.ts +1 -1
- package/dist/src/profiles/applicator.js +48 -48
- package/dist/src/profiles/index.d.ts +5 -5
- package/dist/src/profiles/loader.d.ts +3 -3
- package/dist/src/profiles/loader.js +25 -25
- package/dist/src/profiles/loader.js.map +1 -1
- package/dist/src/profiles/project-loader.d.ts +1 -1
- package/dist/src/profiles/project-loader.js +23 -23
- package/dist/src/profiles/project-loader.js.map +1 -1
- package/dist/src/profiles/scope-enforcer.d.ts +2 -2
- package/dist/src/profiles/scope-enforcer.js +25 -25
- package/dist/src/profiles/scope-enforcer.js.map +1 -1
- package/dist/src/profiles/types.d.ts +2 -2
- package/dist/src/profiles/types.js +50 -48
- package/dist/src/profiles/types.js.map +1 -1
- package/dist/src/registry-manager.d.ts +1 -1
- package/dist/src/registry-manager.js +64 -64
- package/dist/src/registry-manager.js.map +1 -1
- package/dist/src/server.js +136 -136
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/ConnectionManager.d.ts +5 -5
- package/dist/src/services/ConnectionManager.js +45 -45
- package/dist/src/services/ConnectionManager.js.map +1 -1
- package/dist/src/services/GitLabVersionDetector.d.ts +2 -2
- package/dist/src/services/GitLabVersionDetector.js +45 -45
- package/dist/src/services/GitLabVersionDetector.js.map +1 -1
- package/dist/src/services/InstanceConnectionPool.d.ts +2 -2
- package/dist/src/services/InstanceConnectionPool.js +13 -13
- package/dist/src/services/InstanceConnectionPool.js.map +1 -1
- package/dist/src/services/InstanceRateLimiter.js +6 -6
- package/dist/src/services/InstanceRateLimiter.js.map +1 -1
- package/dist/src/services/InstanceRegistry.d.ts +4 -4
- package/dist/src/services/InstanceRegistry.js +23 -23
- package/dist/src/services/InstanceRegistry.js.map +1 -1
- package/dist/src/services/NamespaceTierDetector.d.ts +2 -2
- package/dist/src/services/NamespaceTierDetector.js +30 -30
- package/dist/src/services/NamespaceTierDetector.js.map +1 -1
- package/dist/src/services/SchemaIntrospector.d.ts +1 -1
- package/dist/src/services/SchemaIntrospector.js +42 -42
- package/dist/src/services/SchemaIntrospector.js.map +1 -1
- package/dist/src/services/TokenScopeDetector.d.ts +2 -2
- package/dist/src/services/TokenScopeDetector.js +80 -80
- package/dist/src/services/TokenScopeDetector.js.map +1 -1
- package/dist/src/services/ToolAvailability.d.ts +6 -6
- package/dist/src/services/ToolAvailability.js +122 -122
- package/dist/src/services/ToolAvailability.js.map +1 -1
- package/dist/src/services/WidgetAvailability.d.ts +2 -2
- package/dist/src/services/WidgetAvailability.js +34 -34
- package/dist/src/session-manager.d.ts +3 -2
- package/dist/src/session-manager.js +17 -14
- package/dist/src/session-manager.js.map +1 -1
- package/dist/src/types.js +4 -4
- package/dist/src/utils/description-utils.js +4 -4
- package/dist/src/utils/description-utils.js.map +1 -1
- package/dist/src/utils/error-handler.d.ts +9 -9
- package/dist/src/utils/error-handler.js +187 -187
- package/dist/src/utils/error-handler.js.map +1 -1
- package/dist/src/utils/fetch.js +85 -85
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/gitlab-api.d.ts +1 -1
- package/dist/src/utils/gitlab-api.js +24 -24
- package/dist/src/utils/idConversion.js +47 -47
- package/dist/src/utils/idConversion.js.map +1 -1
- package/dist/src/utils/namespace.d.ts +2 -2
- package/dist/src/utils/namespace.js +15 -15
- package/dist/src/utils/projectIdentifier.js +4 -4
- package/dist/src/utils/request-logger.d.ts +4 -4
- package/dist/src/utils/request-logger.js +5 -5
- package/dist/src/utils/schema-utils.js +24 -24
- package/dist/src/utils/schema-utils.js.map +1 -1
- package/dist/src/utils/smart-user-search.d.ts +1 -1
- package/dist/src/utils/smart-user-search.js +10 -10
- package/dist/src/utils/version.js +1 -1
- package/dist/structured-world-gitlab-mcp-6.62.2.tgz +0 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +18 -21
- package/dist/structured-world-gitlab-mcp-6.62.1.tgz +0 -0
package/dist/src/server.js
CHANGED
|
@@ -60,18 +60,18 @@ async function sendToolsListChangedNotification() {
|
|
|
60
60
|
await sessionManager.broadcastToolsListChanged();
|
|
61
61
|
}
|
|
62
62
|
catch (error) {
|
|
63
|
-
(0, logger_1.logError)(
|
|
63
|
+
(0, logger_1.logError)('Failed to broadcast tools/list_changed notification', { err: error });
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
function registerOAuthEndpoints(app) {
|
|
67
|
-
app.get(
|
|
68
|
-
app.get(
|
|
69
|
-
app.get(
|
|
70
|
-
app.get(
|
|
71
|
-
app.get(
|
|
72
|
-
app.post(
|
|
73
|
-
app.post(
|
|
74
|
-
(0, logger_1.logInfo)(
|
|
67
|
+
app.get('/.well-known/oauth-authorization-server', index_1.metadataHandler);
|
|
68
|
+
app.get('/.well-known/oauth-protected-resource', index_1.protectedResourceHandler);
|
|
69
|
+
app.get('/authorize', index_1.authorizeHandler);
|
|
70
|
+
app.get('/oauth/poll', index_1.pollHandler);
|
|
71
|
+
app.get('/oauth/callback', index_1.callbackHandler);
|
|
72
|
+
app.post('/token', express_1.default.urlencoded({ extended: true }), index_1.tokenHandler);
|
|
73
|
+
app.post('/register', express_1.default.json(), index_1.registerHandler);
|
|
74
|
+
(0, logger_1.logInfo)('OAuth endpoints registered');
|
|
75
75
|
}
|
|
76
76
|
function isTLSEnabled() {
|
|
77
77
|
return !!(config_1.SSL_CERT_PATH && config_1.SSL_KEY_PATH);
|
|
@@ -87,16 +87,16 @@ function loadTLSOptions() {
|
|
|
87
87
|
};
|
|
88
88
|
if (config_1.SSL_CA_PATH) {
|
|
89
89
|
options.ca = fs.readFileSync(config_1.SSL_CA_PATH);
|
|
90
|
-
(0, logger_1.logInfo)(
|
|
90
|
+
(0, logger_1.logInfo)('CA certificate loaded', { path: config_1.SSL_CA_PATH });
|
|
91
91
|
}
|
|
92
92
|
if (config_1.SSL_PASSPHRASE) {
|
|
93
93
|
options.passphrase = config_1.SSL_PASSPHRASE;
|
|
94
94
|
}
|
|
95
|
-
(0, logger_1.logInfo)(
|
|
95
|
+
(0, logger_1.logInfo)('TLS certificates loaded', { path: config_1.SSL_CERT_PATH });
|
|
96
96
|
return options;
|
|
97
97
|
}
|
|
98
98
|
catch (error) {
|
|
99
|
-
(0, logger_1.logError)(
|
|
99
|
+
(0, logger_1.logError)('Failed to load TLS certificates', { err: error });
|
|
100
100
|
throw new Error(`Failed to load TLS certificates: ${String(error)}`, { cause: error });
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -105,27 +105,27 @@ function configureTrustProxy(app) {
|
|
|
105
105
|
return;
|
|
106
106
|
}
|
|
107
107
|
let trustValue = config_1.TRUST_PROXY;
|
|
108
|
-
if (config_1.TRUST_PROXY ===
|
|
108
|
+
if (config_1.TRUST_PROXY === 'true' || config_1.TRUST_PROXY === '1') {
|
|
109
109
|
trustValue = true;
|
|
110
110
|
}
|
|
111
|
-
else if (config_1.TRUST_PROXY ===
|
|
111
|
+
else if (config_1.TRUST_PROXY === 'false' || config_1.TRUST_PROXY === '0') {
|
|
112
112
|
trustValue = false;
|
|
113
113
|
}
|
|
114
114
|
else if (!isNaN(Number(config_1.TRUST_PROXY))) {
|
|
115
115
|
trustValue = Number(config_1.TRUST_PROXY);
|
|
116
116
|
}
|
|
117
|
-
app.set(
|
|
118
|
-
(0, logger_1.logInfo)(
|
|
117
|
+
app.set('trust proxy', trustValue);
|
|
118
|
+
(0, logger_1.logInfo)('Trust proxy configured', { trustValue: String(trustValue) });
|
|
119
119
|
}
|
|
120
120
|
function configureServerTimeouts(server) {
|
|
121
121
|
server.keepAliveTimeout = config_1.HTTP_KEEPALIVE_TIMEOUT_MS;
|
|
122
122
|
server.headersTimeout = config_1.HTTP_KEEPALIVE_TIMEOUT_MS + 5000;
|
|
123
123
|
server.timeout = 0;
|
|
124
|
-
server.on(
|
|
124
|
+
server.on('connection', (socket) => {
|
|
125
125
|
socket.setKeepAlive(true, 30000);
|
|
126
126
|
socket.setNoDelay(true);
|
|
127
127
|
});
|
|
128
|
-
(0, logger_1.logInfo)(
|
|
128
|
+
(0, logger_1.logInfo)('HTTP server timeouts configured for SSE streaming', {
|
|
129
129
|
keepAliveTimeout: server.keepAliveTimeout,
|
|
130
130
|
headersTimeout: server.headersTimeout,
|
|
131
131
|
timeout: server.timeout,
|
|
@@ -145,7 +145,7 @@ function startHttpServer(app, callback) {
|
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
function getProtocol() {
|
|
148
|
-
return isTLSEnabled() ?
|
|
148
|
+
return isTLSEnabled() ? 'https' : 'http';
|
|
149
149
|
}
|
|
150
150
|
const HEARTBEAT_DRAIN_TIMEOUT_MS = 10000;
|
|
151
151
|
function startSseHeartbeat(res, sessionId) {
|
|
@@ -157,7 +157,7 @@ function startSseHeartbeat(res, sessionId) {
|
|
|
157
157
|
pendingDrainTimeout = undefined;
|
|
158
158
|
}
|
|
159
159
|
waitingForDrain = false;
|
|
160
|
-
(0, logger_1.logDebug)(
|
|
160
|
+
(0, logger_1.logDebug)('SSE heartbeat drain recovered', { sessionId });
|
|
161
161
|
};
|
|
162
162
|
const interval = setInterval(() => {
|
|
163
163
|
if (waitingForDrain)
|
|
@@ -169,20 +169,20 @@ function startSseHeartbeat(res, sessionId) {
|
|
|
169
169
|
clearTimeout(pendingDrainTimeout);
|
|
170
170
|
pendingDrainTimeout = undefined;
|
|
171
171
|
}
|
|
172
|
-
res.removeListener(
|
|
172
|
+
res.removeListener('drain', drainListener);
|
|
173
173
|
return;
|
|
174
174
|
}
|
|
175
|
-
const ok = res.write(
|
|
175
|
+
const ok = res.write(': ping\n\n');
|
|
176
176
|
if (!ok) {
|
|
177
177
|
waitingForDrain = true;
|
|
178
178
|
pendingDrainTimeout = setTimeout(() => {
|
|
179
179
|
pendingDrainTimeout = undefined;
|
|
180
180
|
waitingForDrain = false;
|
|
181
|
-
res.removeListener(
|
|
182
|
-
(0, logger_1.logWarn)(
|
|
181
|
+
res.removeListener('drain', drainListener);
|
|
182
|
+
(0, logger_1.logWarn)('SSE heartbeat drain timeout — destroying dead connection', {
|
|
183
183
|
sessionId,
|
|
184
184
|
drainTimeoutMs: HEARTBEAT_DRAIN_TIMEOUT_MS,
|
|
185
|
-
reason:
|
|
185
|
+
reason: 'heartbeat_drain_timeout',
|
|
186
186
|
});
|
|
187
187
|
clearInterval(interval);
|
|
188
188
|
res.locals = res.locals ?? {};
|
|
@@ -191,62 +191,62 @@ function startSseHeartbeat(res, sessionId) {
|
|
|
191
191
|
res.destroy();
|
|
192
192
|
}
|
|
193
193
|
}, HEARTBEAT_DRAIN_TIMEOUT_MS);
|
|
194
|
-
res.once(
|
|
194
|
+
res.once('drain', drainListener);
|
|
195
195
|
}
|
|
196
196
|
}
|
|
197
197
|
catch (err) {
|
|
198
198
|
const errMsg = err instanceof Error ? err.message : String(err);
|
|
199
|
-
(0, logger_1.logWarn)(
|
|
199
|
+
(0, logger_1.logWarn)('SSE heartbeat write error — connection likely dead', {
|
|
200
200
|
sessionId,
|
|
201
201
|
error: errMsg,
|
|
202
|
-
reason:
|
|
202
|
+
reason: 'heartbeat_write_error',
|
|
203
203
|
});
|
|
204
204
|
clearInterval(interval);
|
|
205
205
|
if (pendingDrainTimeout) {
|
|
206
206
|
clearTimeout(pendingDrainTimeout);
|
|
207
207
|
pendingDrainTimeout = undefined;
|
|
208
208
|
}
|
|
209
|
-
res.removeListener(
|
|
209
|
+
res.removeListener('drain', drainListener);
|
|
210
210
|
}
|
|
211
211
|
}, config_1.SSE_HEARTBEAT_MS);
|
|
212
|
-
(0, logger_1.logDebug)(
|
|
212
|
+
(0, logger_1.logDebug)('SSE heartbeat started', { sessionId, intervalMs: config_1.SSE_HEARTBEAT_MS });
|
|
213
213
|
return () => {
|
|
214
214
|
clearInterval(interval);
|
|
215
215
|
if (pendingDrainTimeout) {
|
|
216
216
|
clearTimeout(pendingDrainTimeout);
|
|
217
217
|
pendingDrainTimeout = undefined;
|
|
218
218
|
}
|
|
219
|
-
res.removeListener(
|
|
220
|
-
(0, logger_1.logDebug)(
|
|
219
|
+
res.removeListener('drain', drainListener);
|
|
220
|
+
(0, logger_1.logDebug)('SSE heartbeat stopped', { sessionId });
|
|
221
221
|
};
|
|
222
222
|
}
|
|
223
223
|
function determineTransportMode() {
|
|
224
224
|
const args = process.argv.slice(2);
|
|
225
|
-
(0, logger_1.logInfo)(
|
|
226
|
-
if (args.includes(
|
|
227
|
-
(0, logger_1.logInfo)(
|
|
228
|
-
return
|
|
225
|
+
(0, logger_1.logInfo)('Transport mode detection', { args, PORT: config_1.PORT });
|
|
226
|
+
if (args.includes('stdio')) {
|
|
227
|
+
(0, logger_1.logInfo)('Selected stdio mode (explicit argument)');
|
|
228
|
+
return 'stdio';
|
|
229
229
|
}
|
|
230
230
|
if (process.env.PORT) {
|
|
231
|
-
(0, logger_1.logInfo)(
|
|
232
|
-
return
|
|
231
|
+
(0, logger_1.logInfo)('Selected dual transport mode (SSE + StreamableHTTP) - PORT environment variable detected');
|
|
232
|
+
return 'dual';
|
|
233
233
|
}
|
|
234
|
-
(0, logger_1.logInfo)(
|
|
235
|
-
return
|
|
234
|
+
(0, logger_1.logInfo)('Selected stdio mode (no PORT environment variable)');
|
|
235
|
+
return 'stdio';
|
|
236
236
|
}
|
|
237
237
|
async function startServer() {
|
|
238
238
|
const oauthConfig = (0, index_1.loadOAuthConfig)();
|
|
239
239
|
if (oauthConfig) {
|
|
240
|
-
(0, logger_1.logInfo)(
|
|
241
|
-
(0, logger_1.logInfo)(
|
|
240
|
+
(0, logger_1.logInfo)('Starting in OAuth mode (per-user authentication)');
|
|
241
|
+
(0, logger_1.logInfo)('OAuth client ID configured', { clientId: oauthConfig.gitlabClientId });
|
|
242
242
|
}
|
|
243
243
|
else if (process.env.GITLAB_TOKEN) {
|
|
244
|
-
(0, logger_1.logInfo)(
|
|
244
|
+
(0, logger_1.logInfo)('Starting in static token mode (shared GITLAB_TOKEN)');
|
|
245
245
|
}
|
|
246
246
|
else {
|
|
247
|
-
(0, logger_1.logInfo)(
|
|
247
|
+
(0, logger_1.logInfo)('Starting without authentication - tools/list will work, but tool calls require GITLAB_TOKEN');
|
|
248
248
|
}
|
|
249
|
-
(0, logger_1.logInfo)(
|
|
249
|
+
(0, logger_1.logInfo)('Authentication mode', { mode: (0, index_1.getAuthModeDescription)() });
|
|
250
250
|
if (oauthConfig) {
|
|
251
251
|
await index_1.sessionStore.initialize();
|
|
252
252
|
}
|
|
@@ -254,28 +254,28 @@ async function startServer() {
|
|
|
254
254
|
sessionManager.start();
|
|
255
255
|
const requestTracker = (0, index_3.getRequestTracker)();
|
|
256
256
|
const connectionTracker = (0, index_3.getConnectionTracker)();
|
|
257
|
-
const useCondensedLogging = config_1.LOG_FORMAT ===
|
|
257
|
+
const useCondensedLogging = config_1.LOG_FORMAT === 'condensed';
|
|
258
258
|
requestTracker.setEnabled(useCondensedLogging);
|
|
259
259
|
connectionTracker.setEnabled(useCondensedLogging);
|
|
260
|
-
(0, logger_1.logInfo)(
|
|
260
|
+
(0, logger_1.logInfo)('Access log format', { logFormat: config_1.LOG_FORMAT });
|
|
261
261
|
if (config_1.LOG_FILTER.length > 0) {
|
|
262
|
-
(0, logger_1.logInfo)(
|
|
262
|
+
(0, logger_1.logInfo)('Access log filter rules active', { count: config_1.LOG_FILTER.length });
|
|
263
263
|
}
|
|
264
264
|
const transportMode = determineTransportMode();
|
|
265
265
|
switch (transportMode) {
|
|
266
|
-
case
|
|
266
|
+
case 'stdio': {
|
|
267
267
|
const transport = new stdio_js_1.StdioServerTransport();
|
|
268
|
-
await sessionManager.createSession(
|
|
269
|
-
(0, logger_1.logInfo)(
|
|
268
|
+
await sessionManager.createSession(session_manager_1.STDIO_SESSION_ID, transport);
|
|
269
|
+
(0, logger_1.logInfo)('GitLab MCP Server running on stdio');
|
|
270
270
|
break;
|
|
271
271
|
}
|
|
272
|
-
case
|
|
273
|
-
(0, logger_1.logInfo)(
|
|
272
|
+
case 'dual': {
|
|
273
|
+
(0, logger_1.logInfo)('Setting up dual transport mode (SSE + StreamableHTTP)...');
|
|
274
274
|
const app = (0, express_1.default)();
|
|
275
275
|
app.use(express_1.default.json());
|
|
276
276
|
configureTrustProxy(app);
|
|
277
|
-
app.get(
|
|
278
|
-
res.status(200).json({ status:
|
|
277
|
+
app.get('/health', (_req, res) => {
|
|
278
|
+
res.status(200).json({ status: 'ok' });
|
|
279
279
|
});
|
|
280
280
|
app.use((req, res, next) => {
|
|
281
281
|
if (!useCondensedLogging) {
|
|
@@ -288,18 +288,18 @@ async function startServer() {
|
|
|
288
288
|
}
|
|
289
289
|
const requestId = crypto.randomUUID();
|
|
290
290
|
const clientIp = (0, request_logger_1.getIpAddress)(req);
|
|
291
|
-
const sessionId = req.headers[
|
|
291
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
292
292
|
res.locals.accessLogRequestId = requestId;
|
|
293
293
|
requestTracker.openStack(requestId, clientIp, req.method, req.path, sessionId);
|
|
294
|
-
res.on(
|
|
294
|
+
res.on('finish', () => {
|
|
295
295
|
requestTracker.closeStack(requestId, res.statusCode);
|
|
296
296
|
});
|
|
297
|
-
res.on(
|
|
297
|
+
res.on('close', () => {
|
|
298
298
|
if (res.writableFinished) {
|
|
299
299
|
return;
|
|
300
300
|
}
|
|
301
301
|
if (!res.headersSent) {
|
|
302
|
-
requestTracker.closeStackWithError(requestId,
|
|
302
|
+
requestTracker.closeStackWithError(requestId, 'connection_closed');
|
|
303
303
|
return;
|
|
304
304
|
}
|
|
305
305
|
requestTracker.closeStack(requestId, res.statusCode);
|
|
@@ -311,16 +311,16 @@ async function startServer() {
|
|
|
311
311
|
registerOAuthEndpoints(app);
|
|
312
312
|
}
|
|
313
313
|
if (config_1.DASHBOARD_ENABLED) {
|
|
314
|
-
app.get(
|
|
315
|
-
(0, logger_1.logInfo)(
|
|
314
|
+
app.get('/', index_js_1.dashboardHandler);
|
|
315
|
+
(0, logger_1.logInfo)('Dashboard enabled at GET /');
|
|
316
316
|
}
|
|
317
|
-
app.use([
|
|
318
|
-
const accept = req.headers.accept ??
|
|
319
|
-
if (req.method ===
|
|
317
|
+
app.use(['/', '/mcp'], (req, res, next) => {
|
|
318
|
+
const accept = req.headers.accept ?? '';
|
|
319
|
+
if (req.method === 'POST' && !accept.includes('text/event-stream')) {
|
|
320
320
|
req.headers.accept = accept
|
|
321
321
|
? `${accept}, text/event-stream`
|
|
322
|
-
:
|
|
323
|
-
(0, logger_1.logDebug)(
|
|
322
|
+
: 'application/json, text/event-stream';
|
|
323
|
+
(0, logger_1.logDebug)('Modified Accept header for MCP compatibility', {
|
|
324
324
|
originalAccept: accept,
|
|
325
325
|
newAccept: req.headers.accept,
|
|
326
326
|
});
|
|
@@ -328,13 +328,13 @@ async function startServer() {
|
|
|
328
328
|
next();
|
|
329
329
|
});
|
|
330
330
|
if ((0, index_1.isOAuthEnabled)()) {
|
|
331
|
-
app.use([
|
|
331
|
+
app.use(['/', '/mcp'], index_2.oauthAuthMiddleware);
|
|
332
332
|
}
|
|
333
333
|
const sseTransports = {};
|
|
334
334
|
const streamableTransports = {};
|
|
335
|
-
app.get(
|
|
336
|
-
(0, logger_1.logDebug)(
|
|
337
|
-
const transport = new sse_js_1.SSEServerTransport(
|
|
335
|
+
app.get('/sse', async (req, res) => {
|
|
336
|
+
(0, logger_1.logDebug)('SSE endpoint hit!');
|
|
337
|
+
const transport = new sse_js_1.SSEServerTransport('/messages', res);
|
|
338
338
|
const sessionId = transport.sessionId;
|
|
339
339
|
const clientIp = (0, request_logger_1.getIpAddress)(req);
|
|
340
340
|
const accessLogRequestId = res.locals?.accessLogRequestId;
|
|
@@ -344,12 +344,12 @@ async function startServer() {
|
|
|
344
344
|
try {
|
|
345
345
|
await sessionManager.createSession(sessionId, transport);
|
|
346
346
|
sseTransports[sessionId] = transport;
|
|
347
|
-
(0, logger_1.logDebug)(
|
|
347
|
+
(0, logger_1.logDebug)('SSE transport created with session', { sessionId });
|
|
348
348
|
connectionTracker.openConnection(sessionId, clientIp);
|
|
349
349
|
connectionTracker.incrementRequests(sessionId);
|
|
350
350
|
}
|
|
351
351
|
catch (error) {
|
|
352
|
-
(0, logger_1.logError)(
|
|
352
|
+
(0, logger_1.logError)('Failed to create SSE session', { err: error, sessionId });
|
|
353
353
|
if (!res.headersSent) {
|
|
354
354
|
res.status(500).end();
|
|
355
355
|
}
|
|
@@ -359,40 +359,40 @@ async function startServer() {
|
|
|
359
359
|
let socketError;
|
|
360
360
|
const socket = res.socket;
|
|
361
361
|
if (socket) {
|
|
362
|
-
socket.on(
|
|
362
|
+
socket.on('error', (err) => {
|
|
363
363
|
socketError = err.code ?? err.message;
|
|
364
|
-
(0, logger_1.logWarn)(
|
|
364
|
+
(0, logger_1.logWarn)('SSE socket error', {
|
|
365
365
|
sessionId,
|
|
366
366
|
error: err.message,
|
|
367
367
|
code: err.code,
|
|
368
|
-
reason:
|
|
368
|
+
reason: 'socket_error',
|
|
369
369
|
});
|
|
370
370
|
});
|
|
371
371
|
}
|
|
372
|
-
res.on(
|
|
372
|
+
res.on('close', () => {
|
|
373
373
|
stopHeartbeat();
|
|
374
374
|
delete sseTransports[sessionId];
|
|
375
375
|
const reason = socketError
|
|
376
376
|
? `peer_reset:${socketError}`
|
|
377
377
|
: res.writableFinished
|
|
378
|
-
?
|
|
378
|
+
? 'normal_close'
|
|
379
379
|
: res.locals?.heartbeatFailed
|
|
380
|
-
?
|
|
380
|
+
? 'heartbeat_failed'
|
|
381
381
|
: res.destroyed
|
|
382
|
-
?
|
|
383
|
-
:
|
|
384
|
-
(0, logger_1.logInfo)(
|
|
382
|
+
? 'destroyed'
|
|
383
|
+
: 'client_disconnect';
|
|
384
|
+
(0, logger_1.logInfo)('SSE session disconnected', { sessionId, reason });
|
|
385
385
|
connectionTracker.closeConnection(sessionId, reason);
|
|
386
386
|
sessionManager.removeSession(sessionId).catch((error) => {
|
|
387
|
-
(0, logger_1.logDebug)(
|
|
387
|
+
(0, logger_1.logDebug)('Error removing SSE session on disconnect', { err: error, sessionId });
|
|
388
388
|
});
|
|
389
389
|
});
|
|
390
390
|
});
|
|
391
|
-
app.post(
|
|
392
|
-
(0, logger_1.logDebug)(
|
|
391
|
+
app.post('/messages', async (req, res) => {
|
|
392
|
+
(0, logger_1.logDebug)('SSE messages endpoint hit!');
|
|
393
393
|
const sessionId = req.query.sessionId;
|
|
394
394
|
if (!sessionId || !sseTransports[sessionId]) {
|
|
395
|
-
res.status(404).json({ error:
|
|
395
|
+
res.status(404).json({ error: 'Session not found' });
|
|
396
396
|
return;
|
|
397
397
|
}
|
|
398
398
|
connectionTracker.incrementRequests(sessionId);
|
|
@@ -414,14 +414,14 @@ async function startServer() {
|
|
|
414
414
|
}
|
|
415
415
|
}
|
|
416
416
|
catch (error) {
|
|
417
|
-
(0, logger_1.logError)(
|
|
417
|
+
(0, logger_1.logError)('Error handling SSE message', { err: error });
|
|
418
418
|
if (!res.headersSent) {
|
|
419
|
-
res.status(500).json({ error:
|
|
419
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
420
420
|
}
|
|
421
421
|
}
|
|
422
422
|
});
|
|
423
|
-
app.all([
|
|
424
|
-
const sessionId = req.headers[
|
|
423
|
+
app.all(['/', '/mcp'], async (req, res) => {
|
|
424
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
425
425
|
const accessLogRequestId = res.locals.accessLogRequestId;
|
|
426
426
|
const clientIp = (0, request_logger_1.getIpAddress)(req);
|
|
427
427
|
const oauthSessionId = res.locals.oauthSessionId;
|
|
@@ -432,8 +432,8 @@ async function startServer() {
|
|
|
432
432
|
const instanceLabel = res.locals.instanceLabel;
|
|
433
433
|
if (!useCondensedLogging) {
|
|
434
434
|
const requestContext = (0, request_logger_1.getRequestContext)(req, res);
|
|
435
|
-
(0, logger_1.logInfo)(
|
|
436
|
-
event:
|
|
435
|
+
(0, logger_1.logInfo)('MCP endpoint request received', {
|
|
436
|
+
event: 'mcp_request',
|
|
437
437
|
...requestContext,
|
|
438
438
|
hasToken: !!gitlabToken,
|
|
439
439
|
});
|
|
@@ -476,8 +476,8 @@ async function startServer() {
|
|
|
476
476
|
else {
|
|
477
477
|
if (sessionId) {
|
|
478
478
|
res.status(404).json({
|
|
479
|
-
error:
|
|
480
|
-
message:
|
|
479
|
+
error: 'Session not found',
|
|
480
|
+
message: 'Your session has expired. Please reconnect.',
|
|
481
481
|
});
|
|
482
482
|
return;
|
|
483
483
|
}
|
|
@@ -487,7 +487,7 @@ async function startServer() {
|
|
|
487
487
|
sessionIdGenerator: () => newSessionId,
|
|
488
488
|
onsessioninitialized: (initializedSessionId) => {
|
|
489
489
|
streamableTransports[initializedSessionId] = transport;
|
|
490
|
-
(0, logger_1.logInfo)(
|
|
490
|
+
(0, logger_1.logInfo)('MCP session initialized', {
|
|
491
491
|
sessionId: initializedSessionId,
|
|
492
492
|
method: req.method,
|
|
493
493
|
});
|
|
@@ -501,46 +501,46 @@ async function startServer() {
|
|
|
501
501
|
onsessionclosed: (closedSessionId) => {
|
|
502
502
|
delete streamableTransports[closedSessionId];
|
|
503
503
|
index_1.sessionStore.removeMcpSessionAssociation(closedSessionId);
|
|
504
|
-
connectionTracker.closeConnection(closedSessionId,
|
|
504
|
+
connectionTracker.closeConnection(closedSessionId, 'session_closed');
|
|
505
505
|
sessionManager.removeSession(closedSessionId).catch((err) => {
|
|
506
|
-
(0, logger_1.logDebug)(
|
|
506
|
+
(0, logger_1.logDebug)('Error removing closed session', { err, sessionId: closedSessionId });
|
|
507
507
|
});
|
|
508
|
-
(0, logger_1.logInfo)(
|
|
508
|
+
(0, logger_1.logInfo)('StreamableHTTP session closed', {
|
|
509
509
|
sessionId: closedSessionId,
|
|
510
|
-
reason:
|
|
510
|
+
reason: 'session_closed',
|
|
511
511
|
});
|
|
512
512
|
},
|
|
513
513
|
});
|
|
514
514
|
await sessionManager.createSession(newSessionId, transport);
|
|
515
515
|
await handleWithContext(transport);
|
|
516
516
|
}
|
|
517
|
-
if (req.method ===
|
|
517
|
+
if (req.method === 'GET' && !res.writableEnded) {
|
|
518
518
|
const stopHeartbeat = startSseHeartbeat(res, effectiveSessionId);
|
|
519
519
|
let socketError;
|
|
520
520
|
const socket = res.socket;
|
|
521
521
|
if (socket) {
|
|
522
|
-
socket.on(
|
|
522
|
+
socket.on('error', (err) => {
|
|
523
523
|
socketError = err.code ?? err.message;
|
|
524
|
-
(0, logger_1.logWarn)(
|
|
524
|
+
(0, logger_1.logWarn)('StreamableHTTP GET socket error', {
|
|
525
525
|
sessionId: effectiveSessionId,
|
|
526
526
|
error: err.message,
|
|
527
527
|
code: err.code,
|
|
528
|
-
reason:
|
|
528
|
+
reason: 'socket_error',
|
|
529
529
|
});
|
|
530
530
|
});
|
|
531
531
|
}
|
|
532
|
-
res.on(
|
|
532
|
+
res.on('close', () => {
|
|
533
533
|
stopHeartbeat();
|
|
534
534
|
const reason = socketError
|
|
535
535
|
? `peer_reset:${socketError}`
|
|
536
536
|
: res.writableFinished
|
|
537
|
-
?
|
|
537
|
+
? 'normal_close'
|
|
538
538
|
: res.locals?.heartbeatFailed
|
|
539
|
-
?
|
|
539
|
+
? 'heartbeat_failed'
|
|
540
540
|
: res.destroyed
|
|
541
|
-
?
|
|
542
|
-
:
|
|
543
|
-
(0, logger_1.logInfo)(
|
|
541
|
+
? 'destroyed'
|
|
542
|
+
: 'client_disconnect';
|
|
543
|
+
(0, logger_1.logInfo)('StreamableHTTP GET stream disconnected', {
|
|
544
544
|
sessionId: effectiveSessionId,
|
|
545
545
|
reason,
|
|
546
546
|
});
|
|
@@ -548,76 +548,76 @@ async function startServer() {
|
|
|
548
548
|
}
|
|
549
549
|
}
|
|
550
550
|
catch (error) {
|
|
551
|
-
(0, logger_1.logError)(
|
|
551
|
+
(0, logger_1.logError)('Error in StreamableHTTP transport', { err: error });
|
|
552
552
|
if (!res.headersSent) {
|
|
553
|
-
res.status(500).json({ error:
|
|
553
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
554
554
|
}
|
|
555
555
|
}
|
|
556
556
|
});
|
|
557
557
|
startHttpServer(app, () => {
|
|
558
558
|
const url = `${getProtocol()}://${config_1.HOST}:${config_1.PORT}`;
|
|
559
|
-
(0, logger_1.logInfo)(
|
|
559
|
+
(0, logger_1.logInfo)('GitLab MCP Server running', { url });
|
|
560
560
|
if (isTLSEnabled()) {
|
|
561
|
-
(0, logger_1.logInfo)(
|
|
561
|
+
(0, logger_1.logInfo)('TLS/HTTPS enabled');
|
|
562
562
|
}
|
|
563
|
-
(0, logger_1.logInfo)(
|
|
564
|
-
(0, logger_1.logInfo)(
|
|
565
|
-
(0, logger_1.logInfo)(
|
|
563
|
+
(0, logger_1.logInfo)('Dual Transport Mode Active');
|
|
564
|
+
(0, logger_1.logInfo)('SSE endpoint', { endpoint: `${url}/sse`, note: 'backwards compatibility' });
|
|
565
|
+
(0, logger_1.logInfo)('StreamableHTTP endpoint', {
|
|
566
566
|
endpoint: `${url}/mcp`,
|
|
567
|
-
note:
|
|
567
|
+
note: 'modern, supports SSE + JSON-RPC',
|
|
568
568
|
});
|
|
569
569
|
if ((0, index_1.isOAuthEnabled)()) {
|
|
570
|
-
(0, logger_1.logInfo)(
|
|
571
|
-
(0, logger_1.logInfo)(
|
|
572
|
-
(0, logger_1.logInfo)(
|
|
573
|
-
(0, logger_1.logInfo)(
|
|
570
|
+
(0, logger_1.logInfo)('OAuth Mode Active');
|
|
571
|
+
(0, logger_1.logInfo)('OAuth metadata', { endpoint: `${url}/.well-known/oauth-authorization-server` });
|
|
572
|
+
(0, logger_1.logInfo)('Authorization endpoint', { endpoint: `${url}/authorize` });
|
|
573
|
+
(0, logger_1.logInfo)('Token exchange endpoint', { endpoint: `${url}/token` });
|
|
574
574
|
}
|
|
575
|
-
(0, logger_1.logInfo)(
|
|
575
|
+
(0, logger_1.logInfo)('SSE keepalive configured for proxy chain compatibility', {
|
|
576
576
|
heartbeatMs: config_1.SSE_HEARTBEAT_MS,
|
|
577
577
|
keepAliveTimeoutMs: config_1.HTTP_KEEPALIVE_TIMEOUT_MS,
|
|
578
578
|
});
|
|
579
|
-
(0, logger_1.logInfo)(
|
|
579
|
+
(0, logger_1.logInfo)('Clients can use either transport as needed');
|
|
580
580
|
});
|
|
581
581
|
break;
|
|
582
582
|
}
|
|
583
583
|
}
|
|
584
584
|
}
|
|
585
585
|
async function gracefulShutdown(signal) {
|
|
586
|
-
(0, logger_1.logInfo)(
|
|
586
|
+
(0, logger_1.logInfo)('Shutting down GitLab MCP Server...', { signal });
|
|
587
587
|
try {
|
|
588
588
|
const connTracker = (0, index_3.getConnectionTracker)();
|
|
589
|
-
connTracker.closeAllConnections(
|
|
590
|
-
(0, logger_1.logInfo)(
|
|
589
|
+
connTracker.closeAllConnections('server_shutdown');
|
|
590
|
+
(0, logger_1.logInfo)('All connections closed for shutdown');
|
|
591
591
|
}
|
|
592
592
|
catch (error) {
|
|
593
|
-
(0, logger_1.logError)(
|
|
593
|
+
(0, logger_1.logError)('Error closing connections', { err: error });
|
|
594
594
|
}
|
|
595
595
|
try {
|
|
596
596
|
const sm = (0, session_manager_1.getSessionManager)();
|
|
597
597
|
await sm.shutdown();
|
|
598
|
-
(0, logger_1.logInfo)(
|
|
598
|
+
(0, logger_1.logInfo)('Session manager shut down successfully');
|
|
599
599
|
}
|
|
600
600
|
catch (error) {
|
|
601
|
-
(0, logger_1.logError)(
|
|
601
|
+
(0, logger_1.logError)('Error shutting down session manager', { err: error });
|
|
602
602
|
}
|
|
603
603
|
try {
|
|
604
604
|
await index_1.sessionStore.close();
|
|
605
|
-
(0, logger_1.logInfo)(
|
|
605
|
+
(0, logger_1.logInfo)('Session store closed successfully');
|
|
606
606
|
}
|
|
607
607
|
catch (error) {
|
|
608
|
-
(0, logger_1.logError)(
|
|
608
|
+
(0, logger_1.logError)('Error closing session store', { err: error });
|
|
609
609
|
}
|
|
610
610
|
process.exit(0);
|
|
611
611
|
}
|
|
612
|
-
process.on(
|
|
613
|
-
gracefulShutdown(
|
|
614
|
-
(0, logger_1.logError)(
|
|
612
|
+
process.on('SIGINT', () => {
|
|
613
|
+
gracefulShutdown('SIGINT').catch((err) => {
|
|
614
|
+
(0, logger_1.logError)('Error during graceful shutdown', { err });
|
|
615
615
|
process.exit(1);
|
|
616
616
|
});
|
|
617
617
|
});
|
|
618
|
-
process.on(
|
|
619
|
-
gracefulShutdown(
|
|
620
|
-
(0, logger_1.logError)(
|
|
618
|
+
process.on('SIGTERM', () => {
|
|
619
|
+
gracefulShutdown('SIGTERM').catch((err) => {
|
|
620
|
+
(0, logger_1.logError)('Error during graceful shutdown', { err });
|
|
621
621
|
process.exit(1);
|
|
622
622
|
});
|
|
623
623
|
});
|