@zereight/mcp-gitlab 2.1.15 → 2.1.17

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.
@@ -0,0 +1,57 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, test } from "node:test";
3
+ import { CreateDraftNoteSchema } from "../../schemas.js";
4
+ import { omitIncompleteMergeRequestPosition } from "../../utils/merge-request-position.js";
5
+ describe("When omitIncompleteMergeRequestPosition runs", () => {
6
+ describe("with MCP null-injected SHAs", () => {
7
+ test("should return undefined when all commit SHAs are nullish", () => {
8
+ assert.equal(omitIncompleteMergeRequestPosition({
9
+ base_sha: null,
10
+ head_sha: null,
11
+ start_sha: null,
12
+ position_type: "text",
13
+ }), undefined);
14
+ });
15
+ test("should return undefined for null and undefined", () => {
16
+ assert.equal(omitIncompleteMergeRequestPosition(null), undefined);
17
+ assert.equal(omitIncompleteMergeRequestPosition(undefined), undefined);
18
+ });
19
+ });
20
+ describe("with complete position input", () => {
21
+ test("should return position when all required SHAs are strings", () => {
22
+ const position = {
23
+ base_sha: "abc",
24
+ head_sha: "def",
25
+ start_sha: "ghi",
26
+ position_type: "text",
27
+ old_line: null,
28
+ new_line: 4,
29
+ };
30
+ assert.deepEqual(omitIncompleteMergeRequestPosition(position), position);
31
+ });
32
+ });
33
+ describe("with partially invalid position input", () => {
34
+ test("should pass position through for schema validation to reject", () => {
35
+ const position = {
36
+ base_sha: "abc",
37
+ head_sha: null,
38
+ start_sha: "ghi",
39
+ position_type: "text",
40
+ };
41
+ assert.deepEqual(omitIncompleteMergeRequestPosition(position), position);
42
+ });
43
+ test("should fail schema parse when a required SHA is missing", () => {
44
+ assert.throws(() => CreateDraftNoteSchema.parse({
45
+ project_id: "g/p",
46
+ merge_request_iid: "1",
47
+ body: "note",
48
+ position: omitIncompleteMergeRequestPosition({
49
+ base_sha: "abc",
50
+ head_sha: null,
51
+ start_sha: "ghi",
52
+ position_type: "text",
53
+ }),
54
+ }), /Expected string, received null/);
55
+ });
56
+ });
57
+ });
@@ -0,0 +1,75 @@
1
+ import assert from "node:assert/strict";
2
+ import { describe, test } from "node:test";
3
+ import { sanitizeToolArguments } from "../../utils/tool-args.js";
4
+ describe("When sanitizeToolArguments runs", () => {
5
+ describe("with top-level null optionals", () => {
6
+ test("should omit null and undefined keys for generic tools", () => {
7
+ const result = sanitizeToolArguments("create_draft_note", {
8
+ project_id: "g/p",
9
+ merge_request_iid: "1",
10
+ body: "note",
11
+ position: null,
12
+ resolve_discussion: undefined,
13
+ });
14
+ assert.deepEqual(result, {
15
+ project_id: "g/p",
16
+ merge_request_iid: "1",
17
+ body: "note",
18
+ });
19
+ });
20
+ });
21
+ describe("with nested objects", () => {
22
+ test("should not strip nulls inside nested position objects", () => {
23
+ const position = {
24
+ base_sha: "abc",
25
+ head_sha: "def",
26
+ start_sha: "ghi",
27
+ position_type: "text",
28
+ old_line: null,
29
+ new_line: 12,
30
+ };
31
+ const result = sanitizeToolArguments("create_draft_note", {
32
+ project_id: "g/p",
33
+ merge_request_iid: "1",
34
+ body: "note",
35
+ position,
36
+ });
37
+ assert.deepEqual(result.position, position);
38
+ });
39
+ test("should preserve null entries inside execute_graphql variables", () => {
40
+ const variables = { milestoneId: null, title: "x" };
41
+ const result = sanitizeToolArguments("execute_graphql", {
42
+ query: "query { project { id } }",
43
+ variables,
44
+ });
45
+ assert.deepEqual(result.variables, variables);
46
+ });
47
+ });
48
+ describe("with meaningful falsy values", () => {
49
+ test("should preserve false and zero", () => {
50
+ const result = sanitizeToolArguments("update_merge_request_discussion_note", {
51
+ resolved: false,
52
+ straight: false,
53
+ count: 0,
54
+ label: "",
55
+ });
56
+ assert.deepEqual(result, {
57
+ resolved: false,
58
+ straight: false,
59
+ count: 0,
60
+ label: "",
61
+ });
62
+ });
63
+ });
64
+ describe("with create_label", () => {
65
+ test("should preserve explicit null priority", () => {
66
+ const result = sanitizeToolArguments("create_label", {
67
+ project_id: "g/p",
68
+ name: "bug",
69
+ color: "#ff0000",
70
+ priority: null,
71
+ });
72
+ assert.equal(result.priority, null);
73
+ });
74
+ });
75
+ });
@@ -1,7 +1,7 @@
1
1
  import { zodToJsonSchema } from "zod-to-json-schema";
2
2
  import { toJSONSchema } from "../utils/schema.js";
3
3
  import { USE_GITLAB_WIKI, USE_MILESTONE, USE_PIPELINE, SSE, STREAMABLE_HTTP, } from "../config.js";
4
- import { ApproveMergeRequestSchema, BulkPublishDraftNotesSchema, CancelPipelineJobSchema, CancelPipelineSchema, ConvertWorkItemTypeSchema, CreateBranchSchema, CreateDraftNoteSchema, CreateGroupSchema, CreateGroupWikiPageSchema, CreateIssueLinkSchema, CreateIssueNoteSchema, CreateIssueSchema, CreateIssueEmojiReactionSchema, CreateIssueNoteEmojiReactionSchema, ListIssueEmojiReactionsSchema, ListIssueNoteEmojiReactionsSchema, CreateLabelSchema, MarkAllTodosDoneSchema, ListTodosSchema, MarkTodoDoneSchema, CreateMergeRequestDiscussionNoteSchema, CreateMergeRequestEmojiReactionSchema, ListMergeRequestEmojiReactionsSchema, ListMergeRequestNoteEmojiReactionsSchema, CreateMergeRequestNoteSchema, CreateMergeRequestNoteEmojiReactionSchema, CreateMergeRequestSchema, CreateMergeRequestThreadSchema, CreateNoteSchema, CreateCommitStatusSchema, CreateOrUpdateFileSchema, CreatePipelineSchema, CreateProjectMilestoneSchema, CreateReleaseEvidenceSchema, CreateReleaseSchema, CreateRepositorySchema, CreateTagSchema, CreateTimelineEventSchema, CreateWikiPageSchema, CreateWorkItemNoteSchema, CreateWorkItemEmojiReactionSchema, CreateWorkItemNoteEmojiReactionSchema, ListWorkItemEmojiReactionsSchema, ListWorkItemNoteEmojiReactionsSchema, CreateWorkItemSchema, DeleteBranchSchema, DeleteDraftNoteSchema, DeleteGroupWikiPageSchema, DeleteIssueLinkSchema, DeleteIssueSchema, DeleteIssueEmojiReactionSchema, DeleteIssueNoteEmojiReactionSchema, DeleteLabelSchema, DeleteMergeRequestDiscussionNoteSchema, DeleteMergeRequestNoteSchema, DeleteMergeRequestEmojiReactionSchema, DeleteMergeRequestNoteEmojiReactionSchema, DeleteProjectMilestoneSchema, DeleteReleaseSchema, DeleteTagSchema, DeleteWikiPageSchema, DeleteWorkItemEmojiReactionSchema, DeleteWorkItemNoteEmojiReactionSchema, DownloadAttachmentSchema, DownloadAttachmentRemoteSchema, DownloadJobArtifactsSchema, DownloadJobArtifactsRemoteSchema, DownloadReleaseAssetSchema, EditProjectMilestoneSchema, ExecuteGraphQLSchema, ForkRepositorySchema, HealthCheckSchema, GetBranchSchema, GetBranchDiffsSchema, GetCommitDiffSchema, GetCommitSchema, GetFileBlameSchema, GetDeploymentSchema, GetDraftNoteSchema, GetEnvironmentSchema, GetFileContentsSchema, GetGroupWikiPageSchema, GetIssueLinkSchema, GetIssueSchema, GetJobArtifactFileSchema, GetLabelSchema, GetMergeRequestApprovalStateSchema, GetMergeRequestConflictsSchema, GetMergeRequestDiffsSchema, GetMergeRequestFileDiffSchema, GetMergeRequestNoteSchema, GetMergeRequestNotesSchema, GetMergeRequestSchema, GetMergeRequestVersionSchema, GetMilestoneBurndownEventsSchema, GetMilestoneIssuesSchema, GetMilestoneMergeRequestsSchema, GetNamespaceSchema, GetPipelineJobOutputSchema, GetPipelineSchema, GetProjectEventsSchema, GetProjectMilestoneSchema, GetProjectSchema, GetReleaseSchema, GetRepositoryTreeSchema, GetTagSchema, GetTagSignatureSchema, GetTimelineEventsSchema, GetUsersSchema, GetUserSchema, WhoAmISchema, GetWebhookEventSchema, GetWikiPageSchema, GetWorkItemSchema, ListBranchesSchema, ListCommitsSchema, ListCommitStatusesSchema, ListCustomFieldDefinitionsSchema, ListDeploymentsSchema, ListDraftNotesSchema, ListEnvironmentsSchema, ListEventsSchema, ListGroupIterationsSchema, ListGroupProjectsSchema, ListGroupWikiPagesSchema, ListIssueDiscussionsSchema, ListIssueLinksSchema, ListIssuesSchema, ListJobArtifactsSchema, ListLabelsSchema, ListMergeRequestChangedFilesSchema, ListMergeRequestDiffsSchema, ListMergeRequestDiscussionsSchema, ListMergeRequestPipelinesSchema, ListMergeRequestVersionsSchema, ListMergeRequestsSchema, ListNamespacesSchema, ListPipelineJobsSchema, ListPipelineTriggerJobsSchema, ValidateCiLintSchema, ValidateProjectCiLintSchema, ListPipelinesSchema, ListProjectMembersSchema, ListProjectMilestonesSchema, ListProjectsSchema, ListReleasesSchema, ListTagsSchema, ListWebhookEventsSchema, ListWebhooksSchema, ListWikiPagesSchema, ListWorkItemNotesSchema, ListWorkItemStatusesSchema, ListWorkItemsSchema, MarkdownUploadSchema, MarkdownUploadRemoteSchema, MergeMergeRequestSchema, MoveWorkItemSchema, MyIssuesSchema, PlayPipelineJobSchema, PromoteProjectMilestoneSchema, PublishDraftNoteSchema, PushFilesSchema, ResolveMergeRequestThreadSchema, RetryPipelineJobSchema, RetryPipelineSchema, SearchCodeSchema, SearchGroupCodeSchema, SearchProjectCodeSchema, SearchRepositoriesSchema, UnapproveMergeRequestSchema, UpdateDraftNoteSchema, UpdateGroupWikiPageSchema, UpdateIssueNoteSchema, UpdateIssueSchema, UpdateIssueDescriptionPatchSchema, UpdateLabelSchema, UpdateMergeRequestDiscussionNoteSchema, UpdateMergeRequestNoteSchema, UpdateMergeRequestSchema, UpdateReleaseSchema, UpdateWikiPageSchema, UpdateWorkItemSchema, VerifyNamespaceSchema, } from "../schemas.js";
4
+ import { ApproveMergeRequestSchema, BulkPublishDraftNotesSchema, CancelPipelineJobSchema, CancelPipelineSchema, ConvertWorkItemTypeSchema, CreateBranchSchema, CreateDraftNoteSchema, CreateGroupSchema, CreateGroupWikiPageSchema, CreateIssueLinkSchema, CreateIssueNoteSchema, CreateIssueSchema, CreateIssueEmojiReactionSchema, CreateIssueNoteEmojiReactionSchema, ListIssueEmojiReactionsSchema, ListIssueNoteEmojiReactionsSchema, CreateLabelSchema, MarkAllTodosDoneSchema, ListTodosSchema, MarkTodoDoneSchema, CreateMergeRequestDiscussionNoteSchema, CreateMergeRequestEmojiReactionSchema, ListMergeRequestEmojiReactionsSchema, ListMergeRequestNoteEmojiReactionsSchema, CreateMergeRequestNoteSchema, CreateMergeRequestNoteEmojiReactionSchema, CreateMergeRequestSchema, CreateMergeRequestThreadSchema, CreateNoteSchema, CreateCommitStatusSchema, CreateOrUpdateFileSchema, CreatePipelineSchema, CreateProjectMilestoneSchema, CreateReleaseEvidenceSchema, CreateReleaseSchema, CreateRepositorySchema, CreateTagSchema, CreateTimelineEventSchema, CreateWikiPageSchema, CreateWorkItemNoteSchema, CreateWorkItemEmojiReactionSchema, CreateWorkItemNoteEmojiReactionSchema, ListWorkItemEmojiReactionsSchema, ListWorkItemNoteEmojiReactionsSchema, CreateWorkItemSchema, DeleteBranchSchema, DeleteDraftNoteSchema, DeleteGroupWikiPageSchema, DeleteIssueLinkSchema, DeleteIssueSchema, DeleteIssueEmojiReactionSchema, DeleteIssueNoteEmojiReactionSchema, DeleteLabelSchema, DeleteMergeRequestDiscussionNoteSchema, DeleteMergeRequestNoteSchema, DeleteMergeRequestEmojiReactionSchema, DeleteMergeRequestNoteEmojiReactionSchema, DeleteProjectMilestoneSchema, DeleteReleaseSchema, DeleteTagSchema, DeleteWikiPageSchema, DeleteWorkItemEmojiReactionSchema, DeleteWorkItemNoteEmojiReactionSchema, DownloadAttachmentSchema, DownloadAttachmentRemoteSchema, DownloadJobArtifactsSchema, DownloadJobArtifactsRemoteSchema, DownloadReleaseAssetSchema, EditProjectMilestoneSchema, ExecuteGraphQLSchema, ForkRepositorySchema, HealthCheckSchema, GetBranchSchema, GetBranchDiffsSchema, GetCommitDiffSchema, GetCommitSchema, GetFileBlameSchema, GetDeploymentSchema, GetDraftNoteSchema, GetEnvironmentSchema, GetFileContentsSchema, GetGroupWikiPageSchema, GetIssueLinkSchema, GetIssueSchema, GetJobArtifactFileSchema, GetLabelSchema, GetMergeRequestApprovalStateSchema, GetMergeRequestConflictsSchema, GetMergeRequestDiffsSchema, GetMergeRequestFileDiffSchema, GetMergeRequestNoteSchema, GetMergeRequestNotesSchema, GetMergeRequestSchema, GetMergeRequestVersionSchema, GetMilestoneBurndownEventsSchema, GetMilestoneIssuesSchema, GetMilestoneMergeRequestsSchema, GetNamespaceSchema, GetPipelineJobOutputSchema, GetPipelineSchema, GetProjectEventsSchema, GetProjectMilestoneSchema, GetProjectSchema, GetReleaseSchema, GetRepositoryTreeSchema, GetTagSchema, GetTagSignatureSchema, GetTimelineEventsSchema, GetUsersSchema, GetUserSchema, WhoAmISchema, GetWebhookEventSchema, GetWikiPageSchema, GetWorkItemSchema, ListBranchesSchema, ListCommitsSchema, ListCommitStatusesSchema, ListCustomFieldDefinitionsSchema, ListDeploymentsSchema, ListDraftNotesSchema, ListEnvironmentsSchema, ListEventsSchema, ListGroupIterationsSchema, ListGroupProjectsSchema, ListGroupWikiPagesSchema, ListIssueDiscussionsSchema, ListIssueLinksSchema, ListIssuesSchema, ListJobArtifactsSchema, ListLabelsSchema, ListMergeRequestChangedFilesSchema, ListMergeRequestDiffsSchema, ListMergeRequestDiscussionsSchema, ListMergeRequestPipelinesSchema, ListMergeRequestVersionsSchema, ListMergeRequestsSchema, ListNamespacesSchema, ListPipelineJobsSchema, ListPipelineTriggerJobsSchema, ValidateCiLintSchema, ValidateProjectCiLintSchema, ListPipelinesSchema, ListProjectMembersSchema, ListProjectMilestonesSchema, ListProjectsSchema, ListReleasesSchema, ListTagsSchema, ListWebhookEventsSchema, ListWebhooksSchema, ListWikiPagesSchema, ListWorkItemNotesSchema, ListWorkItemStatusesSchema, ListWorkItemsSchema, MarkdownUploadSchema, MarkdownUploadRemoteSchema, MergeMergeRequestSchema, MoveWorkItemSchema, MyIssuesSchema, PlayPipelineJobSchema, PromoteProjectMilestoneSchema, PublishDraftNoteSchema, PushFilesSchema, ResolveMergeRequestThreadSchema, RetryPipelineJobSchema, RetryPipelineSchema, SearchCodeSchema, SearchGroupCodeSchema, SearchProjectCodeSchema, SearchRepositoriesSchema, UnapproveMergeRequestSchema, UpdateDraftNoteSchema, UpdateGroupWikiPageSchema, UpdateIssueNoteSchema, UpdateIssueSchema, UpdateIssueDescriptionPatchSchema, UpdateLabelSchema, UpdateMergeRequestDiscussionNoteSchema, UpdateMergeRequestNoteSchema, UpdateMergeRequestSchema, UpdateReleaseSchema, UpdateWikiPageSchema, UpdateWorkItemSchema, VerifyNamespaceSchema, ListProjectVariablesSchema, GetProjectVariableSchema, CreateProjectVariableSchema, UpdateProjectVariableSchema, DeleteProjectVariableSchema, ListGroupVariablesSchema, GetGroupVariableSchema, CreateGroupVariableSchema, UpdateGroupVariableSchema, DeleteGroupVariableSchema, } from "../schemas.js";
5
5
  const IS_REMOTE = SSE || STREAMABLE_HTTP;
6
6
  // Define all available tools
7
7
  export const allTools = [
@@ -931,6 +931,57 @@ export const allTools = [
931
931
  description: "Search for code within a specific group (requires advanced search or Zoekt)",
932
932
  inputSchema: toJSONSchema(SearchGroupCodeSchema),
933
933
  },
934
+ // --- CI/CD Variable tools ---
935
+ {
936
+ name: "list_project_variables",
937
+ description: "List CI/CD variables for a project",
938
+ inputSchema: toJSONSchema(ListProjectVariablesSchema),
939
+ },
940
+ {
941
+ name: "get_project_variable",
942
+ description: "Get a single CI/CD variable from a project",
943
+ inputSchema: toJSONSchema(GetProjectVariableSchema),
944
+ },
945
+ {
946
+ name: "create_project_variable",
947
+ description: "Create a CI/CD variable for a project",
948
+ inputSchema: toJSONSchema(CreateProjectVariableSchema),
949
+ },
950
+ {
951
+ name: "update_project_variable",
952
+ description: "Update an existing CI/CD variable in a project",
953
+ inputSchema: toJSONSchema(UpdateProjectVariableSchema),
954
+ },
955
+ {
956
+ name: "delete_project_variable",
957
+ description: "Delete a CI/CD variable from a project",
958
+ inputSchema: toJSONSchema(DeleteProjectVariableSchema),
959
+ },
960
+ {
961
+ name: "list_group_variables",
962
+ description: "List CI/CD variables for a group",
963
+ inputSchema: toJSONSchema(ListGroupVariablesSchema),
964
+ },
965
+ {
966
+ name: "get_group_variable",
967
+ description: "Get a single CI/CD variable from a group",
968
+ inputSchema: toJSONSchema(GetGroupVariableSchema),
969
+ },
970
+ {
971
+ name: "create_group_variable",
972
+ description: "Create a CI/CD variable for a group",
973
+ inputSchema: toJSONSchema(CreateGroupVariableSchema),
974
+ },
975
+ {
976
+ name: "update_group_variable",
977
+ description: "Update an existing CI/CD variable in a group",
978
+ inputSchema: toJSONSchema(UpdateGroupVariableSchema),
979
+ },
980
+ {
981
+ name: "delete_group_variable",
982
+ description: "Delete a CI/CD variable from a group",
983
+ inputSchema: toJSONSchema(DeleteGroupVariableSchema),
984
+ },
934
985
  // --- Meta tool: Dynamic tool discovery ---
935
986
  {
936
987
  name: "discover_tools",
@@ -1050,6 +1101,10 @@ export const readOnlyTools = new Set([
1050
1101
  "list_webhooks",
1051
1102
  "list_webhook_events",
1052
1103
  "get_webhook_event",
1104
+ "list_project_variables",
1105
+ "get_project_variable",
1106
+ "list_group_variables",
1107
+ "get_group_variable",
1053
1108
  ]);
1054
1109
  // Define which tools are destructive (data loss potential)
1055
1110
  export const destructiveTools = new Set([
@@ -1073,7 +1128,8 @@ export const destructiveTools = new Set([
1073
1128
  "delete_branch",
1074
1129
  "merge_merge_request",
1075
1130
  "push_files",
1076
- "delete_branch",
1131
+ "delete_project_variable",
1132
+ "delete_group_variable",
1077
1133
  ]);
1078
1134
  // Define which tools are related to wiki and can be toggled by USE_GITLAB_WIKI
1079
1135
  export const wikiToolNames = new Set([
@@ -1401,6 +1457,22 @@ export const TOOLSET_DEFINITIONS = [
1401
1457
  isDefault: false,
1402
1458
  tools: new Set(["search_code", "search_project_code", "search_group_code"]),
1403
1459
  },
1460
+ {
1461
+ id: "variables",
1462
+ isDefault: false,
1463
+ tools: new Set([
1464
+ "list_project_variables",
1465
+ "get_project_variable",
1466
+ "create_project_variable",
1467
+ "update_project_variable",
1468
+ "delete_project_variable",
1469
+ "list_group_variables",
1470
+ "get_group_variable",
1471
+ "create_group_variable",
1472
+ "update_group_variable",
1473
+ "delete_group_variable",
1474
+ ]),
1475
+ },
1404
1476
  ];
1405
1477
  // Derived lookup: tool name → toolset ID
1406
1478
  export const TOOLSET_BY_TOOL_NAME = new Map();
@@ -0,0 +1,29 @@
1
+ function isShaNullish(value) {
2
+ return value === null || value === undefined;
3
+ }
4
+ /**
5
+ * Normalize optional merge request thread position input before Zod validation.
6
+ * Omits position only when it was not provided or all commit SHAs are nullish (MCP null injection).
7
+ * Partial or invalid SHA sets are passed through so schema validation can reject them.
8
+ */
9
+ export function omitIncompleteMergeRequestPosition(value) {
10
+ if (value === null || value === undefined) {
11
+ return undefined;
12
+ }
13
+ if (typeof value !== "object" || Array.isArray(value)) {
14
+ return value;
15
+ }
16
+ const record = value;
17
+ const { base_sha, head_sha, start_sha } = record;
18
+ const hasAllRequiredShas = typeof base_sha === "string" &&
19
+ typeof head_sha === "string" &&
20
+ typeof start_sha === "string";
21
+ if (hasAllRequiredShas) {
22
+ return value;
23
+ }
24
+ const allShasNullish = isShaNullish(base_sha) && isShaNullish(head_sha) && isShaNullish(start_sha);
25
+ if (allShasNullish) {
26
+ return undefined;
27
+ }
28
+ return value;
29
+ }
@@ -0,0 +1,22 @@
1
+ const TOOL_PRESERVE_TOP_LEVEL_NULL_KEYS = {
2
+ create_label: ["priority"],
3
+ update_label: ["priority"],
4
+ };
5
+ /**
6
+ * Remove omitted optional fields injected as top-level null/undefined by MCP clients.
7
+ * Does not recurse into nested objects so intentional nulls (diff line numbers, GraphQL variables) stay intact.
8
+ */
9
+ export function sanitizeToolArguments(toolName, args) {
10
+ const preserveNullKeys = new Set(TOOL_PRESERVE_TOP_LEVEL_NULL_KEYS[toolName] ?? []);
11
+ const result = {};
12
+ for (const [key, value] of Object.entries(args)) {
13
+ if (value === undefined) {
14
+ continue;
15
+ }
16
+ if (value === null && !preserveNullKeys.has(key)) {
17
+ continue;
18
+ }
19
+ result[key] = value;
20
+ }
21
+ return result;
22
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zereight/mcp-gitlab",
3
- "version": "2.1.15",
3
+ "version": "2.1.17",
4
4
  "mcpName": "io.github.zereight/gitlab-mcp",
5
5
  "description": "GitLab MCP server for projects, merge requests, issues, pipelines, wiki, releases, and more",
6
6
  "keywords": [
@@ -51,7 +51,7 @@
51
51
  "changelog": "auto-changelog -p",
52
52
  "test": "npm run test:all",
53
53
  "test:all": "npm run build && npm run test:mock && npm run test:live",
54
- "test:mock": "node --import tsx/esm --test test/remote-auth-simple-test.ts && node --import tsx/esm --test test/mcp-oauth-tests.ts && node --import tsx/esm --test test/streamable-http-static-token-auth.test.ts && tsx test/oauth-tests.ts && tsx test/test-list-merge-requests.ts && node --import tsx/esm --test test/test-merge-request-pipelines.ts && tsx test/test-list-project-members.ts && tsx test/test-download-attachment.ts && node --import tsx/esm --test test/test-upload-markdown.ts && node --import tsx/esm --test test/test-job-artifacts.ts && node --import tsx/esm --test test/test-deployment-tools.ts && node --import tsx/esm --test test/test-merge-request-approval-state-tools.ts && node --import tsx/esm --test test/test-search-code.ts && node --import tsx/esm --test test/test-tags.ts && node --import tsx/esm --test test/test-toolset-filtering.ts && node --import tsx/esm --test test/test-ci-lint.ts && node --import tsx/esm --test test/test-todos.ts && node --import tsx/esm --test test/test-auth-retry.ts && node --import tsx/esm --test test/test-issue-description-patch.ts && node --import tsx/esm --test test/test-geteffectiveprojectid.ts && node --import tsx/esm --test test/test-get-file-blame.ts && node --import tsx/esm --test test/stateless/codec.test.ts test/stateless/client-id.test.ts test/stateless/callback-proxy.test.ts test/stateless/session-id.test.ts test/stateless/session-id-integration.test.ts test/stateless/config-ttl.test.ts",
54
+ "test:mock": "node --import tsx/esm --test test/remote-auth-simple-test.ts && node --import tsx/esm --test test/mcp-oauth-tests.ts && node --import tsx/esm --test test/streamable-http-static-token-auth.test.ts && tsx test/oauth-tests.ts && tsx test/test-list-merge-requests.ts && node --import tsx/esm --test test/test-merge-request-pipelines.ts && tsx test/test-list-project-members.ts && tsx test/test-download-attachment.ts && node --import tsx/esm --test test/test-upload-markdown.ts && node --import tsx/esm --test test/test-job-artifacts.ts && node --import tsx/esm --test test/test-deployment-tools.ts && node --import tsx/esm --test test/test-merge-request-approval-state-tools.ts && node --import tsx/esm --test test/test-search-code.ts && node --import tsx/esm --test test/test-tags.ts && node --import tsx/esm --test test/test-toolset-filtering.ts && node --import tsx/esm --test test/test-ci-lint.ts && node --import tsx/esm --test test/test-todos.ts && node --import tsx/esm --test test/test-auth-retry.ts && node --import tsx/esm --test test/test-issue-description-patch.ts && node --import tsx/esm --test test/test-geteffectiveprojectid.ts && node --import tsx/esm --test test/test-get-file-blame.ts && node --import tsx/esm --test test/stateless/codec.test.ts test/stateless/client-id.test.ts test/stateless/callback-proxy.test.ts test/stateless/session-id.test.ts test/stateless/session-id-integration.test.ts test/stateless/config-ttl.test.ts && node --import tsx/esm --test test/utils/tool-args.test.ts && node --import tsx/esm --test test/utils/merge-request-position.test.ts && node --import tsx/esm --test test/nullish-tool-arguments-schema.test.ts && node --import tsx/esm --test test/test-ci-variables.ts",
55
55
  "test:stateless": "npm run build && node --import tsx/esm --test test/stateless/codec.test.ts test/stateless/client-id.test.ts test/stateless/callback-proxy.test.ts test/stateless/session-id.test.ts test/stateless/session-id-integration.test.ts test/stateless/config-ttl.test.ts",
56
56
  "test:mcp-oauth": "npm run build && node --import tsx/esm --test test/mcp-oauth-tests.ts",
57
57
  "test:live": "node test/validate-api.js",