@zereight/mcp-gitlab 2.0.5 → 2.0.6
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 -0
- package/build/index.js +142 -99
- package/build/schemas.js +99 -100
- package/build/test/comprehensive-mcp-tests.js +378 -0
- package/build/test/readonly-mcp-tests.js +381 -0
- package/build/test/simple-mcp-tests.js +190 -0
- package/package.json +5 -1
package/build/schemas.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { flexibleBoolean
|
|
2
|
+
import { flexibleBoolean } from "./customSchemas.js";
|
|
3
3
|
// Base schemas for common types
|
|
4
4
|
export const GitLabAuthorSchema = z.object({
|
|
5
5
|
name: z.string(),
|
|
@@ -36,7 +36,7 @@ export const GitLabPipelineSchema = z.object({
|
|
|
36
36
|
label: z.string().optional(),
|
|
37
37
|
group: z.string().optional(),
|
|
38
38
|
tooltip: z.string().optional(),
|
|
39
|
-
has_details:
|
|
39
|
+
has_details: z.boolean().optional(),
|
|
40
40
|
details_path: z.string().optional(),
|
|
41
41
|
illustration: z
|
|
42
42
|
.object({
|
|
@@ -57,7 +57,7 @@ export const GitLabPipelineJobSchema = z.object({
|
|
|
57
57
|
stage: z.string(),
|
|
58
58
|
name: z.string(),
|
|
59
59
|
ref: z.string(),
|
|
60
|
-
tag:
|
|
60
|
+
tag: z.boolean(),
|
|
61
61
|
coverage: z.coerce.number().nullable().optional(),
|
|
62
62
|
created_at: z.string(),
|
|
63
63
|
started_at: z.string().nullable().optional(),
|
|
@@ -98,7 +98,7 @@ export const GitLabPipelineTriggerJobSchema = z.object({
|
|
|
98
98
|
stage: z.string(),
|
|
99
99
|
name: z.string(),
|
|
100
100
|
ref: z.string(),
|
|
101
|
-
tag:
|
|
101
|
+
tag: z.boolean(),
|
|
102
102
|
coverage: z.number().nullable().optional(),
|
|
103
103
|
created_at: z.string(),
|
|
104
104
|
started_at: z.string().nullable().optional(),
|
|
@@ -135,13 +135,13 @@ export const GitLabPipelineTriggerJobSchema = z.object({
|
|
|
135
135
|
})
|
|
136
136
|
.optional(),
|
|
137
137
|
web_url: z.string().optional(),
|
|
138
|
-
allow_failure:
|
|
139
|
-
archived:
|
|
138
|
+
allow_failure: z.boolean().optional(),
|
|
139
|
+
archived: z.boolean().optional(),
|
|
140
140
|
source: z.string().optional(),
|
|
141
141
|
erased_at: z.string().nullable().optional(),
|
|
142
142
|
project: z
|
|
143
143
|
.object({
|
|
144
|
-
ci_job_token_scope_enabled:
|
|
144
|
+
ci_job_token_scope_enabled: z.boolean().optional(),
|
|
145
145
|
})
|
|
146
146
|
.optional(),
|
|
147
147
|
downstream_pipeline: z
|
|
@@ -189,7 +189,7 @@ export const ListPipelinesSchema = z
|
|
|
189
189
|
.describe("The status of pipelines"),
|
|
190
190
|
ref: z.string().optional().describe("The ref of pipelines"),
|
|
191
191
|
sha: z.string().optional().describe("The SHA of pipelines"),
|
|
192
|
-
yaml_errors:
|
|
192
|
+
yaml_errors: z.boolean()
|
|
193
193
|
.optional()
|
|
194
194
|
.describe("Returns pipelines with invalid configurations"),
|
|
195
195
|
username: z.string().optional().describe("The username of the user who triggered pipelines"),
|
|
@@ -222,7 +222,7 @@ export const ListPipelineJobsSchema = z
|
|
|
222
222
|
.enum(["created", "pending", "running", "failed", "success", "canceled", "skipped", "manual"])
|
|
223
223
|
.optional()
|
|
224
224
|
.describe("The scope of jobs to show"),
|
|
225
|
-
include_retried:
|
|
225
|
+
include_retried: z.boolean().optional().describe("Whether to include retried jobs"),
|
|
226
226
|
})
|
|
227
227
|
.merge(PaginationOptionsSchema);
|
|
228
228
|
// Schema for listing trigger jobs (bridges) in a pipeline
|
|
@@ -348,12 +348,12 @@ export const GitLabNamespaceSchema = z.object({
|
|
|
348
348
|
plan: z.string().optional(),
|
|
349
349
|
end_date: z.string().nullable().optional(),
|
|
350
350
|
trial_ends_on: z.string().nullable().optional(),
|
|
351
|
-
trial:
|
|
351
|
+
trial: z.boolean().optional(),
|
|
352
352
|
root_repository_size: z.number().optional(),
|
|
353
353
|
projects_count: z.number().optional(),
|
|
354
354
|
});
|
|
355
355
|
export const GitLabNamespaceExistsResponseSchema = z.object({
|
|
356
|
-
exists:
|
|
356
|
+
exists: z.boolean(),
|
|
357
357
|
suggests: z.array(z.string()).optional(),
|
|
358
358
|
});
|
|
359
359
|
// Repository related schemas
|
|
@@ -373,7 +373,7 @@ export const GitLabRepositorySchema = z.object({
|
|
|
373
373
|
owner: GitLabOwnerSchema.optional(),
|
|
374
374
|
web_url: z.string().optional(),
|
|
375
375
|
description: z.string().nullable(),
|
|
376
|
-
fork:
|
|
376
|
+
fork: z.boolean().optional(),
|
|
377
377
|
ssh_url_to_repo: z.string().optional(),
|
|
378
378
|
http_url_to_repo: z.string().optional(),
|
|
379
379
|
created_at: z.string().optional(),
|
|
@@ -394,7 +394,7 @@ export const GitLabRepositorySchema = z.object({
|
|
|
394
394
|
topics: z.array(z.string()).optional(),
|
|
395
395
|
tag_list: z.array(z.string()).optional(), // deprecated but still present
|
|
396
396
|
open_issues_count: z.number().optional(),
|
|
397
|
-
archived:
|
|
397
|
+
archived: z.boolean().optional(),
|
|
398
398
|
forks_count: z.number().optional(),
|
|
399
399
|
star_count: z.number().optional(),
|
|
400
400
|
permissions: z
|
|
@@ -415,17 +415,17 @@ export const GitLabRepositorySchema = z.object({
|
|
|
415
415
|
.nullable(),
|
|
416
416
|
})
|
|
417
417
|
.optional(),
|
|
418
|
-
container_registry_enabled:
|
|
418
|
+
container_registry_enabled: z.boolean().optional(),
|
|
419
419
|
container_registry_access_level: z.string().optional(),
|
|
420
|
-
issues_enabled:
|
|
421
|
-
merge_requests_enabled:
|
|
420
|
+
issues_enabled: z.boolean().optional(),
|
|
421
|
+
merge_requests_enabled: z.boolean().optional(),
|
|
422
422
|
merge_requests_template: z.string().nullable().optional(),
|
|
423
|
-
wiki_enabled:
|
|
424
|
-
jobs_enabled:
|
|
425
|
-
snippets_enabled:
|
|
426
|
-
can_create_merge_request_in:
|
|
427
|
-
resolve_outdated_diff_discussions:
|
|
428
|
-
shared_runners_enabled:
|
|
423
|
+
wiki_enabled: z.boolean().optional(),
|
|
424
|
+
jobs_enabled: z.boolean().optional(),
|
|
425
|
+
snippets_enabled: z.boolean().optional(),
|
|
426
|
+
can_create_merge_request_in: z.boolean().optional(),
|
|
427
|
+
resolve_outdated_diff_discussions: z.boolean().nullable().optional(),
|
|
428
|
+
shared_runners_enabled: z.boolean().optional(),
|
|
429
429
|
shared_with_groups: z
|
|
430
430
|
.array(z.object({
|
|
431
431
|
group_id: z.coerce.string(),
|
|
@@ -449,7 +449,7 @@ export const GitLabFileContentSchema = z.object({
|
|
|
449
449
|
blob_id: z.string(), // Added to match GitLab API
|
|
450
450
|
commit_id: z.string(), // ID of the current file version
|
|
451
451
|
last_commit_id: z.string(), // Added to match GitLab API
|
|
452
|
-
execute_filemode:
|
|
452
|
+
execute_filemode: z.boolean().optional(), // Added to match GitLab API
|
|
453
453
|
});
|
|
454
454
|
export const GitLabDirectoryContentSchema = z.object({
|
|
455
455
|
name: z.string(),
|
|
@@ -483,7 +483,7 @@ export const GetRepositoryTreeSchema = z.object({
|
|
|
483
483
|
.string()
|
|
484
484
|
.optional()
|
|
485
485
|
.describe("The name of a repository branch or tag. Defaults to the default branch."),
|
|
486
|
-
recursive:
|
|
486
|
+
recursive: z.boolean().optional().describe("Boolean value to get a recursive tree"),
|
|
487
487
|
per_page: z.number().optional().describe("Number of results to show per page"),
|
|
488
488
|
page_token: z.string().optional().describe("The tree record ID for pagination"),
|
|
489
489
|
pagination: z.string().optional().describe("Pagination method (keyset)"),
|
|
@@ -536,7 +536,7 @@ export const GitLabMilestonesSchema = z.object({
|
|
|
536
536
|
state: z.string(),
|
|
537
537
|
updated_at: z.string(),
|
|
538
538
|
created_at: z.string(),
|
|
539
|
-
expired:
|
|
539
|
+
expired: z.boolean(),
|
|
540
540
|
web_url: z.string().optional(),
|
|
541
541
|
});
|
|
542
542
|
// Input schemas for operations
|
|
@@ -544,7 +544,7 @@ export const CreateRepositoryOptionsSchema = z.object({
|
|
|
544
544
|
name: z.string(),
|
|
545
545
|
description: z.string().optional(),
|
|
546
546
|
visibility: z.enum(["private", "internal", "public"]).optional(), // Changed from private to match GitLab API
|
|
547
|
-
initialize_with_readme:
|
|
547
|
+
initialize_with_readme: z.boolean().optional(), // Changed from auto_init to match GitLab API
|
|
548
548
|
});
|
|
549
549
|
export const CreateIssueOptionsSchema = z.object({
|
|
550
550
|
title: z.string(),
|
|
@@ -559,9 +559,9 @@ export const GitLabDiffSchema = z.object({
|
|
|
559
559
|
a_mode: z.string(),
|
|
560
560
|
b_mode: z.string(),
|
|
561
561
|
diff: z.string(),
|
|
562
|
-
new_file:
|
|
563
|
-
renamed_file:
|
|
564
|
-
deleted_file:
|
|
562
|
+
new_file: z.boolean(),
|
|
563
|
+
renamed_file: z.boolean(),
|
|
564
|
+
deleted_file: z.boolean(),
|
|
565
565
|
});
|
|
566
566
|
// Response schemas for operations
|
|
567
567
|
export const GitLabCreateUpdateFileResponseSchema = z.object({
|
|
@@ -594,8 +594,8 @@ export const GitLabCompareResultSchema = z.object({
|
|
|
594
594
|
.optional(),
|
|
595
595
|
commits: z.array(GitLabCommitSchema),
|
|
596
596
|
diffs: z.array(GitLabDiffSchema),
|
|
597
|
-
compare_timeout:
|
|
598
|
-
compare_same_ref:
|
|
597
|
+
compare_timeout: z.boolean().optional(),
|
|
598
|
+
compare_same_ref: z.boolean().optional(),
|
|
599
599
|
});
|
|
600
600
|
// Issue related schemas
|
|
601
601
|
export const GitLabLabelSchema = z.object({
|
|
@@ -608,9 +608,9 @@ export const GitLabLabelSchema = z.object({
|
|
|
608
608
|
open_issues_count: z.number().optional(),
|
|
609
609
|
closed_issues_count: z.number().optional(),
|
|
610
610
|
open_merge_requests_count: z.number().optional(),
|
|
611
|
-
subscribed:
|
|
611
|
+
subscribed: z.boolean().optional(),
|
|
612
612
|
priority: z.number().nullable().optional(),
|
|
613
|
-
is_project_label:
|
|
613
|
+
is_project_label: z.boolean().optional(),
|
|
614
614
|
});
|
|
615
615
|
export const GitLabMilestoneSchema = z.object({
|
|
616
616
|
id: z.coerce.string(),
|
|
@@ -650,9 +650,9 @@ export const GitLabIssueSchema = z.object({
|
|
|
650
650
|
human_total_time_spent: z.string().nullable(),
|
|
651
651
|
})
|
|
652
652
|
.optional(),
|
|
653
|
-
confidential:
|
|
653
|
+
confidential: z.boolean().optional(),
|
|
654
654
|
due_date: z.string().nullable().optional(),
|
|
655
|
-
discussion_locked:
|
|
655
|
+
discussion_locked: z.boolean().nullable().optional(),
|
|
656
656
|
weight: z.number().nullable().optional(),
|
|
657
657
|
issue_type: z.string().describe("the type of issue.").nullish(),
|
|
658
658
|
});
|
|
@@ -692,8 +692,8 @@ export const GitLabMergeRequestSchema = z.object({
|
|
|
692
692
|
title: z.string(),
|
|
693
693
|
description: z.string().nullable(),
|
|
694
694
|
state: z.string(),
|
|
695
|
-
merged:
|
|
696
|
-
draft:
|
|
695
|
+
merged: z.boolean().optional(),
|
|
696
|
+
draft: z.boolean().optional(),
|
|
697
697
|
author: GitLabUserSchema,
|
|
698
698
|
assignees: z.array(GitLabUserSchema).optional(),
|
|
699
699
|
reviewers: z.array(GitLabUserSchema).optional(),
|
|
@@ -709,15 +709,15 @@ export const GitLabMergeRequestSchema = z.object({
|
|
|
709
709
|
detailed_merge_status: z.string().optional(),
|
|
710
710
|
merge_status: z.string().optional(),
|
|
711
711
|
merge_error: z.string().nullable().optional(),
|
|
712
|
-
work_in_progress:
|
|
713
|
-
blocking_discussions_resolved:
|
|
714
|
-
should_remove_source_branch:
|
|
715
|
-
force_remove_source_branch:
|
|
716
|
-
allow_collaboration:
|
|
717
|
-
allow_maintainer_to_push:
|
|
712
|
+
work_in_progress: z.boolean().optional(),
|
|
713
|
+
blocking_discussions_resolved: z.boolean().optional(),
|
|
714
|
+
should_remove_source_branch: z.boolean().nullable().optional(),
|
|
715
|
+
force_remove_source_branch: z.boolean().nullable().optional(),
|
|
716
|
+
allow_collaboration: z.boolean().optional(),
|
|
717
|
+
allow_maintainer_to_push: z.boolean().optional(),
|
|
718
718
|
changes_count: z.string().nullable().optional(),
|
|
719
|
-
merge_when_pipeline_succeeds:
|
|
720
|
-
squash:
|
|
719
|
+
merge_when_pipeline_succeeds: z.boolean().optional(),
|
|
720
|
+
squash: z.boolean().optional(),
|
|
721
721
|
labels: z.array(z.string()).optional(),
|
|
722
722
|
});
|
|
723
723
|
export const LineRangeSchema = z
|
|
@@ -730,7 +730,7 @@ export const LineRangeSchema = z
|
|
|
730
730
|
.optional()
|
|
731
731
|
.describe("CRITICAL: Line identifier in format '{file_path_sha1_hash}_{old_line_number}_{new_line_number}'. USUALLY REQUIRED for GitLab diff comments despite being optional in schema. Example: 'a1b2c3d4e5f6_10_15'. Get this from GitLab diff API response, never fabricate."),
|
|
732
732
|
type: z
|
|
733
|
-
.enum(["new", "old", "expanded"])
|
|
733
|
+
.enum(["new", "old", "expanded", "logic", "style"])
|
|
734
734
|
.nullable()
|
|
735
735
|
.optional()
|
|
736
736
|
.describe("Line type: 'old' = deleted/original line, 'new' = added/modified line, null = unchanged context. MUST match the line_code format and old_line/new_line values."),
|
|
@@ -754,7 +754,7 @@ export const LineRangeSchema = z
|
|
|
754
754
|
.optional()
|
|
755
755
|
.describe("CRITICAL: Line identifier in format '{file_path_sha1_hash}_{old_line_number}_{new_line_number}'. USUALLY REQUIRED for GitLab diff comments despite being optional in schema. Example: 'a1b2c3d4e5f6_12_17'. Must be from same file as start.line_code."),
|
|
756
756
|
type: z
|
|
757
|
-
.enum(["new", "old", "expanded"])
|
|
757
|
+
.enum(["new", "old", "expanded", "logic", "style"])
|
|
758
758
|
.nullable()
|
|
759
759
|
.optional()
|
|
760
760
|
.describe("Line type: 'old' = deleted/original line, 'new' = added/modified line, null = unchanged context. SHOULD MATCH start.type for consistent ranges (don't mix old/new types)."),
|
|
@@ -781,13 +781,13 @@ export const GitLabDiscussionNoteSchema = z.object({
|
|
|
781
781
|
author: GitLabUserSchema.optional(),
|
|
782
782
|
created_at: z.string().optional(),
|
|
783
783
|
updated_at: z.string().optional(),
|
|
784
|
-
system:
|
|
784
|
+
system: z.boolean().optional(),
|
|
785
785
|
noteable_id: z.coerce.string().optional(),
|
|
786
786
|
noteable_type: z.enum(["Issue", "MergeRequest", "Snippet", "Commit", "Epic"]).optional(),
|
|
787
787
|
project_id: z.coerce.string().optional(),
|
|
788
788
|
noteable_iid: z.coerce.string().nullable().optional(),
|
|
789
|
-
resolvable:
|
|
790
|
-
resolved:
|
|
789
|
+
resolvable: z.boolean().optional(),
|
|
790
|
+
resolved: z.boolean().optional(),
|
|
791
791
|
resolved_by: GitLabUserSchema.nullable().optional(),
|
|
792
792
|
resolved_at: z.string().nullable().optional(),
|
|
793
793
|
position: z
|
|
@@ -835,7 +835,7 @@ export const PaginatedResponseSchema = z.object({
|
|
|
835
835
|
});
|
|
836
836
|
export const GitLabDiscussionSchema = z.object({
|
|
837
837
|
id: z.coerce.string(),
|
|
838
|
-
individual_note:
|
|
838
|
+
individual_note: z.boolean(),
|
|
839
839
|
notes: z.array(GitLabDiscussionNoteSchema),
|
|
840
840
|
});
|
|
841
841
|
// Create a schema for paginated discussions response
|
|
@@ -859,7 +859,7 @@ export const UpdateMergeRequestNoteSchema = ProjectParamsSchema.extend({
|
|
|
859
859
|
discussion_id: z.coerce.string().describe("The ID of a thread"),
|
|
860
860
|
note_id: z.coerce.string().describe("The ID of a thread note"),
|
|
861
861
|
body: z.string().optional().describe("The content of the note or reply"),
|
|
862
|
-
resolved:
|
|
862
|
+
resolved: z.boolean().optional().describe("Resolve or unresolve the note"),
|
|
863
863
|
})
|
|
864
864
|
.refine(data => data.body !== undefined || data.resolved !== undefined, {
|
|
865
865
|
message: "At least one of 'body' or 'resolved' must be provided",
|
|
@@ -910,7 +910,7 @@ export const CreateRepositorySchema = z.object({
|
|
|
910
910
|
.enum(["private", "internal", "public"])
|
|
911
911
|
.optional()
|
|
912
912
|
.describe("Repository visibility level"),
|
|
913
|
-
initialize_with_readme:
|
|
913
|
+
initialize_with_readme: z.boolean().optional().describe("Initialize with README.md"),
|
|
914
914
|
});
|
|
915
915
|
export const GetFileContentsSchema = ProjectParamsSchema.extend({
|
|
916
916
|
file_path: z.string().describe("Path to the file or directory"),
|
|
@@ -946,12 +946,12 @@ const MergeRequestOptionsSchema = {
|
|
|
946
946
|
.optional()
|
|
947
947
|
.describe("The ID of the users to assign as reviewers of the MR"),
|
|
948
948
|
labels: z.array(z.string()).optional().describe("Labels for the MR"),
|
|
949
|
-
draft:
|
|
949
|
+
draft: z.boolean().optional().describe("Create as draft merge request"),
|
|
950
950
|
allow_collaboration: z.boolean().optional().describe("Allow commits from upstream members"),
|
|
951
|
-
remove_source_branch:
|
|
951
|
+
remove_source_branch: z.boolean().nullable()
|
|
952
952
|
.optional()
|
|
953
953
|
.describe("Flag indicating if a merge request should remove the source branch when merging."),
|
|
954
|
-
squash:
|
|
954
|
+
squash: z.boolean().nullable()
|
|
955
955
|
.optional()
|
|
956
956
|
.describe("If true, squash all commits into a single commit on merge."),
|
|
957
957
|
};
|
|
@@ -968,7 +968,7 @@ export const CreateBranchSchema = ProjectParamsSchema.extend({
|
|
|
968
968
|
export const GetBranchDiffsSchema = ProjectParamsSchema.extend({
|
|
969
969
|
from: z.string().describe("The base branch or commit SHA to compare from"),
|
|
970
970
|
to: z.string().describe("The target branch or commit SHA to compare to"),
|
|
971
|
-
straight:
|
|
971
|
+
straight: z.boolean()
|
|
972
972
|
.optional()
|
|
973
973
|
.describe("Comparison method: false for '...' (default), true for '--'"),
|
|
974
974
|
excluded_file_patterns: z
|
|
@@ -998,17 +998,17 @@ export const UpdateMergeRequestSchema = GetMergeRequestSchema.extend({
|
|
|
998
998
|
.boolean()
|
|
999
999
|
.optional()
|
|
1000
1000
|
.describe("Flag indicating if the source branch should be removed"),
|
|
1001
|
-
squash:
|
|
1002
|
-
draft:
|
|
1001
|
+
squash: z.boolean().optional().describe("Squash commits into a single commit when merging"),
|
|
1002
|
+
draft: z.boolean().optional().describe("Work in progress merge request"),
|
|
1003
1003
|
});
|
|
1004
1004
|
export const MergeMergeRequestSchema = ProjectParamsSchema.extend({
|
|
1005
1005
|
merge_request_iid: z.coerce.string().optional().describe("The IID of a merge request"),
|
|
1006
|
-
auto_merge:
|
|
1006
|
+
auto_merge: z.boolean().optional().default(false).describe("If true, the merge request merges when the pipeline succeeds."),
|
|
1007
1007
|
merge_commit_message: z.string().optional().describe("Custom merge commit message"),
|
|
1008
|
-
merge_when_pipeline_succeeds:
|
|
1009
|
-
should_remove_source_branch:
|
|
1008
|
+
merge_when_pipeline_succeeds: z.boolean().optional().default(false).describe("If true, the merge request merges when the pipeline succeeds.in GitLab 17.11. Use"),
|
|
1009
|
+
should_remove_source_branch: z.boolean().optional().default(false).describe("Remove source branch after merge"),
|
|
1010
1010
|
squash_commit_message: z.string().optional().describe("Custom squash commit message"),
|
|
1011
|
-
squash:
|
|
1011
|
+
squash: z.boolean().optional().default(false).describe("Squash commits into a single commit when merging"),
|
|
1012
1012
|
});
|
|
1013
1013
|
export const GetMergeRequestDiffsSchema = GetMergeRequestSchema.extend({
|
|
1014
1014
|
view: z.enum(["inline", "parallel"]).optional().describe("Diff view type"),
|
|
@@ -1016,7 +1016,7 @@ export const GetMergeRequestDiffsSchema = GetMergeRequestSchema.extend({
|
|
|
1016
1016
|
export const ListMergeRequestDiffsSchema = GetMergeRequestSchema.extend({
|
|
1017
1017
|
page: z.number().optional().describe("Page number for pagination (default: 1)"),
|
|
1018
1018
|
per_page: z.number().optional().describe("Number of items per page (max: 100, default: 20)"),
|
|
1019
|
-
unidiff:
|
|
1019
|
+
unidiff: z.boolean()
|
|
1020
1020
|
.optional()
|
|
1021
1021
|
.describe("Present diffs in the unified diff format. Default is false. Introduced in GitLab 16.5."),
|
|
1022
1022
|
});
|
|
@@ -1045,21 +1045,19 @@ export const ListIssuesSchema = z
|
|
|
1045
1045
|
.describe("Return issues assigned to the given username"),
|
|
1046
1046
|
author_id: z.coerce.string().optional().describe("Return issues created by the given user ID"),
|
|
1047
1047
|
author_username: z.string().optional().describe("Return issues created by the given username"),
|
|
1048
|
-
confidential:
|
|
1048
|
+
confidential: z.boolean().optional().describe("Filter confidential or public issues"),
|
|
1049
1049
|
created_after: z.string().optional().describe("Return issues created after the given time"),
|
|
1050
1050
|
created_before: z.string().optional().describe("Return issues created before the given time"),
|
|
1051
1051
|
due_date: z.string().optional().describe("Return issues that have the due date"),
|
|
1052
1052
|
labels: z.array(z.string()).optional().describe("Array of label names"),
|
|
1053
1053
|
milestone: z.string().optional().describe("Milestone title"),
|
|
1054
1054
|
issue_type: z
|
|
1055
|
-
.
|
|
1055
|
+
.enum(["issue", "incident", "test_case", "task"])
|
|
1056
1056
|
.optional()
|
|
1057
|
-
.nullable()
|
|
1058
1057
|
.describe("Filter to a given type of issue. One of issue, incident, test_case or task"),
|
|
1059
1058
|
iteration_id: z.coerce
|
|
1060
1059
|
.string()
|
|
1061
1060
|
.optional()
|
|
1062
|
-
.nullable()
|
|
1063
1061
|
.describe("Return issues assigned to the given iteration ID. None returns issues that do not belong to an iteration. Any returns issues that belong to an iteration. "),
|
|
1064
1062
|
scope: z
|
|
1065
1063
|
.enum(["created_by_me", "assigned_to_me", "all"])
|
|
@@ -1072,7 +1070,7 @@ export const ListIssuesSchema = z
|
|
|
1072
1070
|
.describe("Return issues with a specific state"),
|
|
1073
1071
|
updated_after: z.string().optional().describe("Return issues updated after the given time"),
|
|
1074
1072
|
updated_before: z.string().optional().describe("Return issues updated before the given time"),
|
|
1075
|
-
with_labels_details:
|
|
1073
|
+
with_labels_details: z.boolean().optional().describe("Return more details for each label"),
|
|
1076
1074
|
})
|
|
1077
1075
|
.merge(PaginationOptionsSchema);
|
|
1078
1076
|
// Merge Requests API operation schemas
|
|
@@ -1157,7 +1155,7 @@ export const ListMergeRequestsSchema = z
|
|
|
1157
1155
|
.enum(["yes", "no"])
|
|
1158
1156
|
.optional()
|
|
1159
1157
|
.describe("Filter merge requests against their wip status"),
|
|
1160
|
-
with_labels_details:
|
|
1158
|
+
with_labels_details: z.boolean().optional().describe("Return more details for each label"),
|
|
1161
1159
|
})
|
|
1162
1160
|
.merge(PaginationOptionsSchema);
|
|
1163
1161
|
export const GetIssueSchema = z.object({
|
|
@@ -1170,8 +1168,8 @@ export const UpdateIssueSchema = z.object({
|
|
|
1170
1168
|
title: z.string().optional().describe("The title of the issue"),
|
|
1171
1169
|
description: z.string().optional().describe("The description of the issue"),
|
|
1172
1170
|
assignee_ids: z.array(z.number()).optional().describe("Array of user IDs to assign issue to"),
|
|
1173
|
-
confidential:
|
|
1174
|
-
discussion_locked:
|
|
1171
|
+
confidential: z.boolean().optional().describe("Set the issue to be confidential"),
|
|
1172
|
+
discussion_locked: z.boolean().optional().describe("Flag to lock discussions"),
|
|
1175
1173
|
due_date: z.string().optional().describe("Date the issue is due (YYYY-MM-DD)"),
|
|
1176
1174
|
labels: z.array(z.string()).optional().describe("Array of label names"),
|
|
1177
1175
|
milestone_id: z.coerce.string().optional().describe("Milestone ID to assign"),
|
|
@@ -1217,7 +1215,7 @@ export const DeleteIssueLinkSchema = z.object({
|
|
|
1217
1215
|
export const ListNamespacesSchema = z
|
|
1218
1216
|
.object({
|
|
1219
1217
|
search: z.string().optional().describe("Search term for namespaces"),
|
|
1220
|
-
owned:
|
|
1218
|
+
owned: z.boolean().optional().describe("Filter for namespaces owned by current user"),
|
|
1221
1219
|
})
|
|
1222
1220
|
.merge(PaginationOptionsSchema);
|
|
1223
1221
|
export const GetNamespaceSchema = z.object({
|
|
@@ -1233,15 +1231,15 @@ export const GetProjectSchema = z.object({
|
|
|
1233
1231
|
export const ListProjectsSchema = z
|
|
1234
1232
|
.object({
|
|
1235
1233
|
search: z.string().optional().describe("Search term for projects"),
|
|
1236
|
-
search_namespaces:
|
|
1234
|
+
search_namespaces: z.boolean()
|
|
1237
1235
|
.optional()
|
|
1238
1236
|
.describe("Needs to be true if search is full path"),
|
|
1239
|
-
owned:
|
|
1240
|
-
membership:
|
|
1237
|
+
owned: z.boolean().optional().describe("Filter for projects owned by current user"),
|
|
1238
|
+
membership: z.boolean()
|
|
1241
1239
|
.optional()
|
|
1242
1240
|
.describe("Filter for projects where current user is a member"),
|
|
1243
|
-
simple:
|
|
1244
|
-
archived:
|
|
1241
|
+
simple: z.boolean().optional().describe("Return only limited fields"),
|
|
1242
|
+
archived: z.boolean().optional().describe("Filter for archived projects"),
|
|
1245
1243
|
visibility: z
|
|
1246
1244
|
.enum(["public", "internal", "private"])
|
|
1247
1245
|
.optional()
|
|
@@ -1272,13 +1270,13 @@ export const ListLabelsSchema = z.object({
|
|
|
1272
1270
|
.boolean()
|
|
1273
1271
|
.optional()
|
|
1274
1272
|
.describe("Whether or not to include issue and merge request counts"),
|
|
1275
|
-
include_ancestor_groups:
|
|
1273
|
+
include_ancestor_groups: z.boolean().optional().describe("Include ancestor groups"),
|
|
1276
1274
|
search: z.string().optional().describe("Keyword to filter labels by"),
|
|
1277
1275
|
});
|
|
1278
1276
|
export const GetLabelSchema = z.object({
|
|
1279
1277
|
project_id: z.coerce.string().describe("Project ID or URL-encoded path"),
|
|
1280
1278
|
label_id: z.coerce.string().describe("The ID or title of a project's label"),
|
|
1281
|
-
include_ancestor_groups:
|
|
1279
|
+
include_ancestor_groups: z.boolean().optional().describe("Include ancestor groups"),
|
|
1282
1280
|
});
|
|
1283
1281
|
export const CreateLabelSchema = z.object({
|
|
1284
1282
|
project_id: z.coerce.string().describe("Project ID or URL-encoded path"),
|
|
@@ -1308,14 +1306,14 @@ export const DeleteLabelSchema = z.object({
|
|
|
1308
1306
|
export const ListGroupProjectsSchema = z
|
|
1309
1307
|
.object({
|
|
1310
1308
|
group_id: z.coerce.string().describe("Group ID or path"),
|
|
1311
|
-
include_subgroups:
|
|
1309
|
+
include_subgroups: z.boolean().optional().describe("Include projects from subgroups"),
|
|
1312
1310
|
search: z.string().optional().describe("Search term to filter projects"),
|
|
1313
1311
|
order_by: z
|
|
1314
1312
|
.enum(["name", "path", "created_at", "updated_at", "last_activity_at"])
|
|
1315
1313
|
.optional()
|
|
1316
1314
|
.describe("Field to sort by"),
|
|
1317
1315
|
sort: z.enum(["asc", "desc"]).optional().describe("Sort direction"),
|
|
1318
|
-
archived:
|
|
1316
|
+
archived: z.boolean().optional().describe("Filter for archived projects"),
|
|
1319
1317
|
visibility: z
|
|
1320
1318
|
.enum(["public", "internal", "private"])
|
|
1321
1319
|
.optional()
|
|
@@ -1330,17 +1328,17 @@ export const ListGroupProjectsSchema = z
|
|
|
1330
1328
|
.describe("Filter projects with merge requests feature enabled"),
|
|
1331
1329
|
min_access_level: z.number().optional().describe("Filter by minimum access level"),
|
|
1332
1330
|
with_programming_language: z.string().optional().describe("Filter by programming language"),
|
|
1333
|
-
starred:
|
|
1334
|
-
statistics:
|
|
1335
|
-
with_custom_attributes:
|
|
1336
|
-
with_security_reports:
|
|
1331
|
+
starred: z.boolean().optional().describe("Filter by starred projects"),
|
|
1332
|
+
statistics: z.boolean().optional().describe("Include project statistics"),
|
|
1333
|
+
with_custom_attributes: z.boolean().optional().describe("Include custom attributes"),
|
|
1334
|
+
with_security_reports: z.boolean().optional().describe("Include security reports"),
|
|
1337
1335
|
})
|
|
1338
1336
|
.merge(PaginationOptionsSchema);
|
|
1339
1337
|
// Add wiki operation schemas
|
|
1340
1338
|
export const ListWikiPagesSchema = z
|
|
1341
1339
|
.object({
|
|
1342
1340
|
project_id: z.coerce.string().describe("Project ID or URL-encoded path"),
|
|
1343
|
-
with_content:
|
|
1341
|
+
with_content: z.boolean().optional().describe("Include content of the wiki pages"),
|
|
1344
1342
|
})
|
|
1345
1343
|
.merge(PaginationOptionsSchema);
|
|
1346
1344
|
export const GetWikiPageSchema = z.object({
|
|
@@ -1451,7 +1449,7 @@ export const GitLabDraftNoteSchema = z.object({
|
|
|
1451
1449
|
created_at: z.string().optional(),
|
|
1452
1450
|
updated_at: z.string().optional(),
|
|
1453
1451
|
position: MergeRequestThreadPositionSchema.nullable().optional(),
|
|
1454
|
-
resolve_discussion:
|
|
1452
|
+
resolve_discussion: z.boolean().optional(),
|
|
1455
1453
|
}).transform((data) => ({
|
|
1456
1454
|
// Normalize the response to always have consistent field names
|
|
1457
1455
|
id: data.id,
|
|
@@ -1476,7 +1474,7 @@ export const CreateDraftNoteSchema = ProjectParamsSchema.extend({
|
|
|
1476
1474
|
merge_request_iid: z.coerce.string().describe("The IID of a merge request"),
|
|
1477
1475
|
body: z.string().describe("The content of the draft note"),
|
|
1478
1476
|
position: MergeRequestThreadPositionCreateSchema.optional().describe("Position when creating a diff note"),
|
|
1479
|
-
resolve_discussion:
|
|
1477
|
+
resolve_discussion: z.boolean().optional().describe("Whether to resolve the discussion when publishing"),
|
|
1480
1478
|
});
|
|
1481
1479
|
// Update draft note schema
|
|
1482
1480
|
export const UpdateDraftNoteSchema = ProjectParamsSchema.extend({
|
|
@@ -1484,7 +1482,7 @@ export const UpdateDraftNoteSchema = ProjectParamsSchema.extend({
|
|
|
1484
1482
|
draft_note_id: z.coerce.string().describe("The ID of the draft note"),
|
|
1485
1483
|
body: z.string().optional().describe("The content of the draft note"),
|
|
1486
1484
|
position: MergeRequestThreadPositionCreateSchema.optional().describe("Position when creating a diff note"),
|
|
1487
|
-
resolve_discussion:
|
|
1485
|
+
resolve_discussion: z.boolean().optional().describe("Whether to resolve the discussion when publishing"),
|
|
1488
1486
|
});
|
|
1489
1487
|
// Delete draft note schema
|
|
1490
1488
|
export const DeleteDraftNoteSchema = ProjectParamsSchema.extend({
|
|
@@ -1523,7 +1521,7 @@ export const ListProjectMilestonesSchema = ProjectParamsSchema.extend({
|
|
|
1523
1521
|
.string()
|
|
1524
1522
|
.optional()
|
|
1525
1523
|
.describe("Return only milestones with a title or description matching the provided string"),
|
|
1526
|
-
include_ancestors:
|
|
1524
|
+
include_ancestors: z.boolean().optional().describe("Include ancestor groups"),
|
|
1527
1525
|
updated_before: z
|
|
1528
1526
|
.string()
|
|
1529
1527
|
.optional()
|
|
@@ -1582,26 +1580,27 @@ export const ListCommitsSchema = z.object({
|
|
|
1582
1580
|
.describe("Only commits before or on this date are returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ"),
|
|
1583
1581
|
path: z.string().optional().describe("The file path"),
|
|
1584
1582
|
author: z.string().optional().describe("Search commits by commit author"),
|
|
1585
|
-
all:
|
|
1586
|
-
with_stats:
|
|
1583
|
+
all: z.boolean().optional().describe("Retrieve every commit from the repository"),
|
|
1584
|
+
with_stats: z.boolean()
|
|
1587
1585
|
.optional()
|
|
1588
1586
|
.describe("Stats about each commit are added to the response"),
|
|
1589
|
-
first_parent:
|
|
1587
|
+
first_parent: z.boolean()
|
|
1590
1588
|
.optional()
|
|
1591
1589
|
.describe("Follow only the first parent commit upon seeing a merge commit"),
|
|
1592
1590
|
order: z.enum(["default", "topo"]).optional().describe("List commits in order"),
|
|
1593
|
-
trailers:
|
|
1591
|
+
trailers: z.boolean().optional().describe("Parse and include Git trailers for every commit"),
|
|
1594
1592
|
page: z.number().optional().describe("Page number for pagination (default: 1)"),
|
|
1595
1593
|
per_page: z.number().optional().describe("Number of items per page (max: 100, default: 20)"),
|
|
1596
1594
|
});
|
|
1597
1595
|
export const GetCommitSchema = z.object({
|
|
1598
1596
|
project_id: z.coerce.string().describe("Project ID or complete URL-encoded path to project"),
|
|
1599
1597
|
sha: z.string().describe("The commit hash or name of a repository branch or tag"),
|
|
1600
|
-
stats:
|
|
1598
|
+
stats: z.boolean().optional().describe("Include commit stats"),
|
|
1601
1599
|
});
|
|
1602
1600
|
export const GetCommitDiffSchema = z.object({
|
|
1603
1601
|
project_id: z.coerce.string().describe("Project ID or complete URL-encoded path to project"),
|
|
1604
1602
|
sha: z.string().describe("The commit hash or name of a repository branch or tag"),
|
|
1603
|
+
full_diff: flexibleBoolean.optional().describe("Whether to return the full diff or only first page (default: false)"),
|
|
1605
1604
|
});
|
|
1606
1605
|
// Schema for listing issues assigned to the current user
|
|
1607
1606
|
export const MyIssuesSchema = z.object({
|
|
@@ -1686,14 +1685,14 @@ export const ListGroupIterationsSchema = z
|
|
|
1686
1685
|
.string()
|
|
1687
1686
|
.optional()
|
|
1688
1687
|
.describe("Return only iterations with a title matching the provided string."),
|
|
1689
|
-
|
|
1688
|
+
search_in: z
|
|
1690
1689
|
.array(z.enum(["title", "cadence_title"]))
|
|
1691
1690
|
.optional()
|
|
1692
1691
|
.describe("Fields in which fuzzy search should be performed with the query given in the argument search. The available options are title and cadence_title. Default is [title]."),
|
|
1693
|
-
include_ancestors:
|
|
1692
|
+
include_ancestors: z.boolean()
|
|
1694
1693
|
.optional()
|
|
1695
1694
|
.describe("Include iterations for group and its ancestors. Defaults to true."),
|
|
1696
|
-
include_descendants:
|
|
1695
|
+
include_descendants: z.boolean()
|
|
1697
1696
|
.optional()
|
|
1698
1697
|
.describe("Include iterations for group and its descendants. Defaults to false."),
|
|
1699
1698
|
updated_before: z
|
|
@@ -1727,7 +1726,7 @@ export const GitLabEventSchema = z.object({
|
|
|
1727
1726
|
created_at: z.string(),
|
|
1728
1727
|
author: GitLabEventAuthorSchema,
|
|
1729
1728
|
author_username: z.string(),
|
|
1730
|
-
imported:
|
|
1729
|
+
imported: z.boolean(),
|
|
1731
1730
|
imported_from: z.string(),
|
|
1732
1731
|
}).passthrough(); // Allow additional fields
|
|
1733
1732
|
// List events schema
|