mcp4openapi 0.3.0 → 0.3.3

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.
Files changed (81) hide show
  1. package/README.md +7 -0
  2. package/dist/src/auth/oauth-provider.d.ts.map +1 -1
  3. package/dist/src/auth/oauth-provider.js +5 -2
  4. package/dist/src/auth/oauth-provider.js.map +1 -1
  5. package/dist/src/core/cli-config.d.ts.map +1 -1
  6. package/dist/src/core/cli-config.js +3 -0
  7. package/dist/src/core/cli-config.js.map +1 -1
  8. package/dist/src/core/index.d.ts.map +1 -1
  9. package/dist/src/core/index.js +19 -3
  10. package/dist/src/core/index.js.map +1 -1
  11. package/dist/src/generated-schemas.d.ts +45 -0
  12. package/dist/src/generated-schemas.d.ts.map +1 -1
  13. package/dist/src/generated-schemas.js +3 -0
  14. package/dist/src/generated-schemas.js.map +1 -1
  15. package/dist/src/openapi/openapi-parser.d.ts.map +1 -1
  16. package/dist/src/openapi/openapi-parser.js +22 -0
  17. package/dist/src/openapi/openapi-parser.js.map +1 -1
  18. package/dist/src/profile/profile-allowlist.d.ts +18 -0
  19. package/dist/src/profile/profile-allowlist.d.ts.map +1 -0
  20. package/dist/src/profile/profile-allowlist.js +68 -0
  21. package/dist/src/profile/profile-allowlist.js.map +1 -0
  22. package/dist/src/profile/profile-loader.d.ts.map +1 -1
  23. package/dist/src/profile/profile-loader.js +8 -1
  24. package/dist/src/profile/profile-loader.js.map +1 -1
  25. package/dist/src/profile/profile-registry.d.ts +7 -1
  26. package/dist/src/profile/profile-registry.d.ts.map +1 -1
  27. package/dist/src/profile/profile-registry.js +49 -8
  28. package/dist/src/profile/profile-registry.js.map +1 -1
  29. package/dist/src/profile/profile-resolver.d.ts +16 -0
  30. package/dist/src/profile/profile-resolver.d.ts.map +1 -1
  31. package/dist/src/profile/profile-resolver.js +120 -0
  32. package/dist/src/profile/profile-resolver.js.map +1 -1
  33. package/dist/src/tooling/composite-executor.d.ts.map +1 -1
  34. package/dist/src/tooling/composite-executor.js +7 -2
  35. package/dist/src/tooling/composite-executor.js.map +1 -1
  36. package/dist/src/tooling/proxy-executor.d.ts.map +1 -1
  37. package/dist/src/tooling/proxy-executor.js +4 -0
  38. package/dist/src/tooling/proxy-executor.js.map +1 -1
  39. package/dist/src/tooling/tool-generator.d.ts.map +1 -1
  40. package/dist/src/tooling/tool-generator.js +36 -3
  41. package/dist/src/tooling/tool-generator.js.map +1 -1
  42. package/dist/src/transport/http-transport-config.d.ts.map +1 -1
  43. package/dist/src/transport/http-transport-config.js +1 -0
  44. package/dist/src/transport/http-transport-config.js.map +1 -1
  45. package/dist/src/transport/http-transport.d.ts +5 -0
  46. package/dist/src/transport/http-transport.d.ts.map +1 -1
  47. package/dist/src/transport/http-transport.js +63 -1
  48. package/dist/src/transport/http-transport.js.map +1 -1
  49. package/dist/src/transport/profile-index.d.ts +84 -0
  50. package/dist/src/transport/profile-index.d.ts.map +1 -0
  51. package/dist/src/transport/profile-index.js +405 -0
  52. package/dist/src/transport/profile-index.js.map +1 -0
  53. package/dist/src/types/http-transport.d.ts +1 -0
  54. package/dist/src/types/http-transport.d.ts.map +1 -1
  55. package/dist/src/types/openapi.d.ts +3 -0
  56. package/dist/src/types/openapi.d.ts.map +1 -1
  57. package/dist/src/types/profile.d.ts +3 -0
  58. package/dist/src/types/profile.d.ts.map +1 -1
  59. package/dist/src/validation/validation-utils.d.ts.map +1 -1
  60. package/dist/src/validation/validation-utils.js +1 -0
  61. package/dist/src/validation/validation-utils.js.map +1 -1
  62. package/html/profile-index.html +386 -0
  63. package/package.json +3 -2
  64. package/profile-schema.json +14 -0
  65. package/profiles/gitlab/developer-profile-oauth.json +244 -42
  66. package/profiles/gitlab/developer-profile-oauth.test.json +1009 -5
  67. package/profiles/gitlab/openapi.yaml +1419 -164
  68. package/profiles/gitlab/profile-optimized-oauth.json +785 -0
  69. package/profiles/gitlab/profile-optimized-oauth.test.json +1566 -0
  70. package/profiles/grafana/openapi.json +28078 -0
  71. package/profiles/grafana/profile.json +1083 -0
  72. package/profiles/grafana/profile.test.json +235 -0
  73. package/profiles/mattermost/openapi.yaml +27434 -0
  74. package/profiles/mattermost/profile.json +463 -0
  75. package/profiles/mattermost/profile.test.json +607 -0
  76. package/profiles/n8n/profile-optimized.json +1002 -364
  77. package/profiles/n8n/profile-optimized.test.json +43 -43
  78. package/profiles/n8n/profile.json +1 -1
  79. package/profiles/n8n-nodes/profile-nodes.json +1 -1
  80. package/profiles/semgrep/profile.json +1 -1
  81. package/profiles/youtrack/profile.json +1 -1
@@ -0,0 +1,785 @@
1
+ {
2
+ "$schema": "../../profile-schema.json",
3
+ "profile_name": "gitlab-optimized-oauth",
4
+ "profile_id": "gitlab-optimized",
5
+ "profile_aliases": ["gitlab-optimized-oauth"],
6
+ "openapi_spec_path": "./openapi.yaml",
7
+ "description": "Minimal CRUD-style tool set grouped by read/write actions. Special operations like GLQL are separate.",
8
+
9
+ "parameter_aliases": {
10
+ "id": ["project_id", "group_id", "resource_id"],
11
+ "badge_id": ["badge_id"],
12
+ "branch": ["branch"],
13
+ "user_id": ["user_id"],
14
+ "job_id": ["job_id"],
15
+ "merge_request_iid": ["iid", "mr_iid"],
16
+ "issue_iid": ["iid"],
17
+ "note_id": ["comment_id"],
18
+ "file_path": ["path", "filepath"],
19
+ "path": ["file_path", "filepath"],
20
+ "pipeline_id": ["pipeline"],
21
+ "discussion_id": ["discussion"],
22
+ "hook_id": ["webhook_id"],
23
+ "snippet_id": ["snippet"],
24
+ "tag_name": ["tag"]
25
+ },
26
+
27
+ "tools": [
28
+ {
29
+ "name": "retrieve_content",
30
+ "description": "Read-only access to GitLab content (projects, issues, merge requests, snippets, repository, members, labels, milestones, pipelines, hooks, variables). Actions: 'list_projects', 'get_project', 'list_project_members', 'list_project_hooks', 'get_project_hook', 'list_project_variables', 'get_project_variable', 'list_issues', 'list_issues_global', 'get_issue', 'list_issue_notes', 'get_issue_note', 'list_issue_discussions', 'get_issue_discussion', 'list_issue_note_award_emoji', 'get_issue_note_award_emoji', 'list_merge_requests', 'get_merge_request', 'list_merge_request_notes', 'get_merge_request_note', 'list_merge_request_commits', 'list_merge_request_diffs', 'list_merge_request_raw_diffs', 'list_merge_request_pipelines', 'list_snippets', 'get_snippet', 'download_snippet', 'get_file', 'download_file', 'list_repository_tree', 'compare_refs', 'get_commit', 'list_pipelines', 'list_pipeline_jobs', 'get_job', 'download_job_artifacts', 'download_job_artifact', 'list_project_labels', 'list_group_labels', 'list_project_milestones', 'list_group_milestones'.",
31
+ "metadata_params": ["action", "project_id", "issue_iid", "merge_request_iid", "note_id", "snippet_id", "file_path", "pipeline_id", "job_id", "hook_id", "key"],
32
+ "operations": {
33
+ "list_projects": "getApiV4Projects",
34
+ "get_project": "getApiV4ProjectsId",
35
+ "list_project_members": "getApiV4ProjectsIdMembers",
36
+ "list_project_hooks": "getApiV4ProjectsIdHooks",
37
+ "get_project_hook": "getApiV4ProjectsIdHooksHookId",
38
+ "list_project_variables": "getApiV4ProjectsIdVariables",
39
+ "get_project_variable": "getApiV4ProjectsIdVariablesKey",
40
+ "list_issues": "getApiV4ProjectsIdIssues",
41
+ "list_issues_global": "getApiV4Issues",
42
+ "get_issue": "getApiV4ProjectsIdIssuesIssueIid",
43
+ "list_issue_notes": "getApiV4ProjectsIdIssuesIssueIidNotes",
44
+ "get_issue_note": "getApiV4ProjectsIdIssuesIssueIidNotesNoteId",
45
+ "list_issue_discussions": "getApiV4ProjectsIdIssuesIssueIidDiscussions",
46
+ "get_issue_discussion": "getApiV4ProjectsIdIssuesIssueIidDiscussionsDiscussionId",
47
+ "list_issue_note_award_emoji": "getApiV4ProjectsIdIssuesIssueIidNotesNoteIdAwardEmoji",
48
+ "get_issue_note_award_emoji": "getApiV4ProjectsIdIssuesIssueIidNotesNoteIdAwardEmojiAwardId",
49
+ "list_merge_requests": "getApiV4ProjectsIdMergeRequests",
50
+ "get_merge_request": "getApiV4ProjectsIdMergeRequestsMergeRequestIid",
51
+ "list_merge_request_notes": "getApiV4ProjectsIdMergeRequestsMergeRequestIidNotes",
52
+ "get_merge_request_note": "getApiV4ProjectsIdMergeRequestsMergeRequestIidNotesNoteId",
53
+ "list_merge_request_commits": "getApiV4ProjectsIdMergeRequestsMergeRequestIidCommits",
54
+ "list_merge_request_diffs": "getApiV4ProjectsIdMergeRequestsMergeRequestIidDiffs",
55
+ "list_merge_request_raw_diffs": "getApiV4ProjectsIdMergeRequestsMergeRequestIidRawDiffs",
56
+ "list_merge_request_pipelines": "getApiV4ProjectsIdMergeRequestsMergeRequestIidPipelines",
57
+ "list_snippets": "getApiV4ProjectsIdSnippets",
58
+ "get_snippet": "getApiV4ProjectsIdSnippetsSnippetId",
59
+ "download_snippet": {
60
+ "type": "proxy_download",
61
+ "metadata_endpoint": "getApiV4ProjectsIdSnippetsSnippetId",
62
+ "download_endpoint": "getApiV4ProjectsIdSnippetsSnippetIdRaw"
63
+ },
64
+ "get_file": "getApiV4ProjectsIdRepositoryFilesFilePath",
65
+ "download_file": "getApiV4ProjectsIdRepositoryFilesFilePathRaw",
66
+ "list_repository_tree": "getApiV4ProjectsIdRepositoryTree",
67
+ "compare_refs": "getApiV4ProjectsIdRepositoryCompare",
68
+ "get_commit": "getApiV4ProjectsIdRepositoryCommitsSha",
69
+ "list_pipelines": "getApiV4ProjectsIdPipelines",
70
+ "list_pipeline_jobs": "getApiV4ProjectsIdPipelinesPipelineIdJobs",
71
+ "get_job": "getSingleJob",
72
+ "download_job_artifacts": {
73
+ "type": "proxy_download",
74
+ "metadata_endpoint": "getSingleJob",
75
+ "download_endpoint": "getApiV4ProjectsIdJobsJobIdArtifacts"
76
+ },
77
+ "download_job_artifact": {
78
+ "type": "proxy_download",
79
+ "metadata_endpoint": "getSingleJob",
80
+ "download_endpoint": "getApiV4ProjectsIdJobsJobIdArtifactsArtifactPath"
81
+ },
82
+ "list_project_labels": "getApiV4ProjectsIdLabels",
83
+ "list_group_labels": "getApiV4GroupsIdLabels",
84
+ "list_project_milestones": "getApiV4ProjectsIdMilestones",
85
+ "list_group_milestones": "getApiV4GroupsIdMilestones"
86
+ },
87
+ "response_fields": {
88
+ "list_projects": ["id", "name", "path", "path_with_namespace", "description", "visibility", "web_url", "last_activity_at", "star_count", "forks_count", "avatar_url", "namespace"],
89
+ "list_project_members": ["id", "name", "username", "access_level"],
90
+ "list_project_hooks": ["id", "url", "push_events", "issues_events", "merge_requests_events"],
91
+ "get_project_hook": ["id", "url", "push_events", "issues_events", "merge_requests_events"],
92
+ "list_project_variables": ["key", "value", "protected", "masked", "environment_scope"],
93
+ "get_project_variable": ["key", "value", "protected", "masked", "environment_scope"],
94
+ "list_issues": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at", "updated_at"],
95
+ "list_issues_global": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at", "updated_at"],
96
+ "get_issue": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at", "updated_at"],
97
+ "list_issue_notes": ["id", "body", "author", "created_at", "updated_at", "system", "confidential"],
98
+ "get_issue_note": ["id", "body", "author", "created_at", "updated_at", "system", "confidential", "attachment"],
99
+ "list_issue_discussions": ["id", "notes", "resolved"],
100
+ "get_issue_discussion": ["id", "notes", "resolved"],
101
+ "list_issue_note_award_emoji": ["id", "name", "user", "created_at"],
102
+ "get_issue_note_award_emoji": ["id", "name", "user", "created_at"],
103
+ "list_merge_requests": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at", "updated_at"],
104
+ "get_merge_request": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at", "updated_at"],
105
+ "list_merge_request_notes": ["id", "body", "author", "created_at", "updated_at", "system", "confidential"],
106
+ "get_merge_request_note": ["id", "body", "author", "created_at", "updated_at", "system", "confidential", "attachment"],
107
+ "list_merge_request_commits": ["id", "short_id", "title", "message", "author_name", "authored_date", "committed_date"],
108
+ "list_merge_request_diffs": ["old_path", "new_path", "new_file", "renamed_file", "deleted_file", "diff"],
109
+ "list_merge_request_pipelines": ["id", "status", "ref", "sha", "web_url"],
110
+ "list_snippets": ["id", "title", "file_name", "visibility"],
111
+ "get_snippet": ["id", "title", "file_name", "description", "visibility"],
112
+ "get_file": ["file_name", "file_path", "size", "encoding", "content", "ref", "blob_id", "commit_id", "last_commit_id"],
113
+ "list_pipelines": ["id", "status", "ref", "web_url"],
114
+ "list_pipeline_jobs": ["id", "status", "stage", "name", "ref", "web_url"],
115
+ "get_job": ["id", "status", "stage", "name", "ref", "web_url"],
116
+ "list_project_labels": ["id", "name", "color", "description"],
117
+ "list_group_labels": ["id", "name", "color", "description"],
118
+ "list_project_milestones": ["id", "iid", "title", "state"],
119
+ "list_group_milestones": ["id", "iid", "title", "state"]
120
+ },
121
+ "parameters": {
122
+ "action": {
123
+ "type": "string",
124
+ "enum": ["list_projects", "get_project", "list_project_members", "list_project_hooks", "get_project_hook", "list_project_variables", "get_project_variable", "list_issues", "list_issues_global", "get_issue", "list_issue_notes", "get_issue_note", "list_issue_discussions", "get_issue_discussion", "list_issue_note_award_emoji", "get_issue_note_award_emoji", "list_merge_requests", "get_merge_request", "list_merge_request_notes", "get_merge_request_note", "list_merge_request_commits", "list_merge_request_diffs", "list_merge_request_raw_diffs", "list_merge_request_pipelines", "list_snippets", "get_snippet", "download_snippet", "get_file", "download_file", "list_repository_tree", "compare_refs", "get_commit", "list_pipelines", "list_pipeline_jobs", "get_job", "download_job_artifacts", "download_job_artifact", "list_project_labels", "list_group_labels", "list_project_milestones", "list_group_milestones"],
125
+ "description": "Action to perform",
126
+ "required": true
127
+ },
128
+ "project_id": {
129
+ "type": "string",
130
+ "description": "Project ID. Use numeric ID (e.g. '123') or URL-encoded path (e.g. 'group%2Fproject').",
131
+ "required_for": ["get_project", "list_project_members", "list_project_hooks", "get_project_hook", "list_project_variables", "get_project_variable", "list_issues", "get_issue", "list_issue_notes", "get_issue_note", "list_issue_discussions", "get_issue_discussion", "list_issue_note_award_emoji", "get_issue_note_award_emoji", "list_merge_requests", "get_merge_request", "list_merge_request_notes", "get_merge_request_note", "list_merge_request_commits", "list_merge_request_diffs", "list_merge_request_raw_diffs", "list_merge_request_pipelines", "list_snippets", "get_snippet", "download_snippet", "get_file", "download_file", "list_repository_tree", "compare_refs", "get_commit", "list_pipelines", "list_pipeline_jobs", "get_job", "download_job_artifacts", "download_job_artifact", "list_project_labels", "list_project_milestones"],
132
+ "example": "123"
133
+ },
134
+ "issue_iid": {
135
+ "type": "integer",
136
+ "description": "The internal ID of the issue",
137
+ "required_for": ["get_issue", "list_issue_notes", "get_issue_note", "list_issue_discussions", "get_issue_discussion", "list_issue_note_award_emoji", "get_issue_note_award_emoji"]
138
+ },
139
+ "merge_request_iid": {
140
+ "type": "integer",
141
+ "description": "The internal ID of the merge request",
142
+ "required_for": ["get_merge_request", "list_merge_request_notes", "get_merge_request_note", "list_merge_request_commits", "list_merge_request_diffs", "list_merge_request_raw_diffs", "list_merge_request_pipelines"]
143
+ },
144
+ "note_id": {
145
+ "type": "integer",
146
+ "description": "The ID of the note",
147
+ "required_for": ["get_issue_note", "get_merge_request_note", "list_issue_note_award_emoji", "get_issue_note_award_emoji"]
148
+ },
149
+ "discussion_id": {
150
+ "type": "string",
151
+ "description": "The ID of the discussion",
152
+ "required_for": ["get_issue_discussion"]
153
+ },
154
+ "award_id": {
155
+ "type": "integer",
156
+ "description": "The ID of the award emoji",
157
+ "required_for": ["get_issue_note_award_emoji"]
158
+ },
159
+ "hook_id": {
160
+ "type": "integer",
161
+ "description": "The ID of the project hook",
162
+ "required_for": ["get_project_hook"]
163
+ },
164
+ "key": {
165
+ "type": "string",
166
+ "description": "Project variable key",
167
+ "required_for": ["get_project_variable"]
168
+ },
169
+ "group_id": {
170
+ "type": "string",
171
+ "description": "Group ID",
172
+ "required_for": ["list_group_labels", "list_group_milestones"]
173
+ },
174
+ "snippet_id": {
175
+ "type": "integer",
176
+ "description": "Snippet ID",
177
+ "required_for": ["get_snippet", "download_snippet"]
178
+ },
179
+ "file_path": {
180
+ "type": "string",
181
+ "description": "URL-encoded full path to the file, e.g., 'src%2Findex.js'. Use %2F instead of '/'.",
182
+ "required_for": ["get_file", "download_file"]
183
+ },
184
+ "ref": {
185
+ "type": "string",
186
+ "description": "Branch name, tag, or commit SHA to read from",
187
+ "required_for": ["get_file", "download_file"],
188
+ "example": "main"
189
+ },
190
+ "path": {
191
+ "type": "string",
192
+ "description": "Directory path within repository (for list_repository_tree)"
193
+ },
194
+ "from": {
195
+ "type": "string",
196
+ "description": "Source ref (for compare_refs)",
197
+ "required_for": ["compare_refs"]
198
+ },
199
+ "to": {
200
+ "type": "string",
201
+ "description": "Target ref (for compare_refs)",
202
+ "required_for": ["compare_refs"]
203
+ },
204
+ "sha": {
205
+ "type": "string",
206
+ "description": "Commit SHA (for get_commit)",
207
+ "required_for": ["get_commit"]
208
+ },
209
+ "pipeline_id": {
210
+ "type": "integer",
211
+ "description": "Pipeline ID (for list_pipeline_jobs)",
212
+ "required_for": ["list_pipeline_jobs"]
213
+ },
214
+ "job_id": {
215
+ "type": "integer",
216
+ "description": "Job ID (for get_job or artifact download)",
217
+ "required_for": ["get_job", "download_job_artifacts", "download_job_artifact"]
218
+ },
219
+ "artifact_path": {
220
+ "type": "string",
221
+ "description": "Path to a file inside the job artifacts archive",
222
+ "required_for": ["download_job_artifact"]
223
+ },
224
+ "state": {
225
+ "type": "string",
226
+ "enum": ["opened", "closed", "merged", "all"],
227
+ "description": "Filter by issue or merge request state",
228
+ "default": "opened"
229
+ },
230
+ "search": {
231
+ "type": "string",
232
+ "description": "Search issues by title or description (for list_issues_global)"
233
+ },
234
+ "labels": {
235
+ "type": "string",
236
+ "description": "Filter by labels (comma-separated, for list_issues_global)"
237
+ },
238
+ "milestone": {
239
+ "type": "string",
240
+ "description": "Filter by milestone title (for list_issues_global)"
241
+ },
242
+ "assignee_id": {
243
+ "type": "integer",
244
+ "description": "Filter by assignee ID (for list_issues_global)"
245
+ },
246
+ "assignee_username": {
247
+ "type": "string",
248
+ "description": "Filter by assignee username (for list_issues_global)"
249
+ },
250
+ "author_id": {
251
+ "type": "integer",
252
+ "description": "Filter by author ID (for list_issues_global)"
253
+ },
254
+ "scope": {
255
+ "type": "string",
256
+ "enum": ["created_by_me", "assigned_to_me", "all"],
257
+ "description": "Issue scope (for list_issues_global)"
258
+ },
259
+ "page": {
260
+ "type": "integer",
261
+ "description": "Page number for pagination",
262
+ "default": 1
263
+ },
264
+ "per_page": {
265
+ "type": "integer",
266
+ "description": "Items per page (recommended max 100)",
267
+ "default": 50
268
+ }
269
+ }
270
+ },
271
+
272
+ {
273
+ "name": "create_content",
274
+ "description": "Create GitLab content. Actions: 'create_issue', 'create_merge_request', 'create_issue_note', 'create_merge_request_note', 'create_issue_discussion', 'reply_issue_discussion', 'create_issue_note_award_emoji', 'create_merge_request_pipeline', 'create_file', 'create_project_variable', 'create_project_hook'.",
275
+ "metadata_params": ["action", "project_id", "issue_iid", "merge_request_iid"],
276
+ "operations": {
277
+ "create_issue": "postApiV4ProjectsIdIssues",
278
+ "create_merge_request": "postApiV4ProjectsIdMergeRequests",
279
+ "create_issue_note": "postApiV4ProjectsIdIssuesIssueIidNotes",
280
+ "create_merge_request_note": "postApiV4ProjectsIdMergeRequestsMergeRequestIidNotes",
281
+ "create_issue_discussion": "postApiV4ProjectsIdIssuesIssueIidDiscussions",
282
+ "reply_issue_discussion": "postApiV4ProjectsIdIssuesIssueIidDiscussionsDiscussionIdNotes",
283
+ "create_issue_note_award_emoji": "postApiV4ProjectsIdIssuesIssueIidNotesNoteIdAwardEmoji",
284
+ "create_merge_request_pipeline": "postApiV4ProjectsIdMergeRequestsMergeRequestIidPipelines",
285
+ "create_file": "postApiV4ProjectsIdRepositoryFilesFilePath",
286
+ "create_project_variable": "postApiV4ProjectsIdVariables",
287
+ "create_project_hook": "postApiV4ProjectsIdHooks"
288
+ },
289
+ "response_fields": {
290
+ "create_issue": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at"],
291
+ "create_merge_request": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at"],
292
+ "create_issue_note": ["id", "body", "author", "created_at", "system", "confidential"],
293
+ "create_merge_request_note": ["id", "body", "author", "created_at", "system", "confidential"],
294
+ "create_issue_discussion": ["id", "notes", "resolved"],
295
+ "reply_issue_discussion": ["id", "notes", "resolved"],
296
+ "create_issue_note_award_emoji": ["id", "name", "user", "created_at"],
297
+ "create_merge_request_pipeline": ["id", "status", "ref", "sha", "web_url"],
298
+ "create_file": ["file_name", "file_path", "size", "encoding", "content", "ref", "blob_id", "commit_id", "last_commit_id"],
299
+ "create_project_variable": ["key", "value", "protected", "masked", "environment_scope"],
300
+ "create_project_hook": ["id", "url", "push_events", "issues_events", "merge_requests_events"]
301
+ },
302
+ "parameters": {
303
+ "action": {
304
+ "type": "string",
305
+ "enum": ["create_issue", "create_merge_request", "create_issue_note", "create_merge_request_note", "create_issue_discussion", "reply_issue_discussion", "create_issue_note_award_emoji", "create_merge_request_pipeline", "create_file", "create_project_variable", "create_project_hook"],
306
+ "description": "Action to perform",
307
+ "required": true
308
+ },
309
+ "project_id": {
310
+ "type": "string",
311
+ "description": "Project ID. Use numeric ID (e.g. '123') or URL-encoded path (e.g. 'group%2Fproject').",
312
+ "required": true,
313
+ "example": "123"
314
+ },
315
+ "issue_iid": {
316
+ "type": "integer",
317
+ "description": "The internal ID of the issue",
318
+ "required_for": ["create_issue_note", "create_issue_discussion", "reply_issue_discussion", "create_issue_note_award_emoji"]
319
+ },
320
+ "merge_request_iid": {
321
+ "type": "integer",
322
+ "description": "The internal ID of the merge request",
323
+ "required_for": ["create_merge_request_note", "create_merge_request_pipeline"]
324
+ },
325
+ "discussion_id": {
326
+ "type": "string",
327
+ "description": "The ID of the discussion",
328
+ "required_for": ["reply_issue_discussion"]
329
+ },
330
+ "note_id": {
331
+ "type": "integer",
332
+ "description": "The ID of the note",
333
+ "required_for": ["create_issue_note_award_emoji"]
334
+ },
335
+ "name": {
336
+ "type": "string",
337
+ "description": "Emoji name (for award emoji actions)",
338
+ "required_for": ["create_issue_note_award_emoji"]
339
+ },
340
+ "title": {
341
+ "type": "string",
342
+ "description": "Title",
343
+ "required_for": ["create_issue", "create_merge_request"],
344
+ "example": "Implement new feature"
345
+ },
346
+ "description": {
347
+ "type": "string",
348
+ "description": "Description",
349
+ "example": "This implements the new feature requested by the team."
350
+ },
351
+ "source_branch": {
352
+ "type": "string",
353
+ "description": "Source branch (required for create_merge_request)",
354
+ "required_for": ["create_merge_request"],
355
+ "example": "feature/new-feature"
356
+ },
357
+ "target_branch": {
358
+ "type": "string",
359
+ "description": "Target branch (required for create_merge_request)",
360
+ "required_for": ["create_merge_request"],
361
+ "example": "main"
362
+ },
363
+ "body": {
364
+ "type": "string",
365
+ "description": "Note body",
366
+ "required_for": ["create_issue_note", "create_merge_request_note", "create_issue_discussion", "reply_issue_discussion"],
367
+ "example": "Looks good to me."
368
+ },
369
+ "assignee_id": {
370
+ "type": "integer",
371
+ "description": "The ID of the user to assign the issue to (optional for create_issue)",
372
+ "example": 123
373
+ },
374
+ "assignee_ids": {
375
+ "type": "array",
376
+ "items": { "type": "integer" },
377
+ "description": "The IDs of the users to assign the issue to (optional for create_issue)",
378
+ "example": [123, 456]
379
+ },
380
+ "labels": {
381
+ "type": "string",
382
+ "description": "Labels to be added (comma-separated)",
383
+ "example": "bug,feature,frontend"
384
+ },
385
+ "reviewer_ids": {
386
+ "type": "array",
387
+ "items": { "type": "integer" },
388
+ "description": "The IDs of the users to review the merge request (optional for create_merge_request)"
389
+ },
390
+ "file_path": {
391
+ "type": "string",
392
+ "description": "URL-encoded full path to the file, e.g., 'src%2Findex.js'. Use %2F instead of '/'.",
393
+ "required_for": ["create_file"]
394
+ },
395
+ "branch": {
396
+ "type": "string",
397
+ "description": "Branch name for file operations",
398
+ "required_for": ["create_file"]
399
+ },
400
+ "content": {
401
+ "type": "string",
402
+ "description": "File content",
403
+ "required_for": ["create_file"]
404
+ },
405
+ "commit_message": {
406
+ "type": "string",
407
+ "description": "Commit message",
408
+ "required_for": ["create_file"]
409
+ },
410
+ "key": {
411
+ "type": "string",
412
+ "description": "Project variable key",
413
+ "required_for": ["create_project_variable"]
414
+ },
415
+ "value": {
416
+ "type": "string",
417
+ "description": "Project variable value",
418
+ "required_for": ["create_project_variable"]
419
+ },
420
+ "protected": {
421
+ "type": "boolean",
422
+ "description": "Whether the variable is protected"
423
+ },
424
+ "masked": {
425
+ "type": "boolean",
426
+ "description": "Whether the variable is masked"
427
+ },
428
+ "environment_scope": {
429
+ "type": "string",
430
+ "description": "Environment scope for the variable"
431
+ },
432
+ "url": {
433
+ "type": "string",
434
+ "description": "Hook URL",
435
+ "required_for": ["create_project_hook"]
436
+ },
437
+ "push_events": {
438
+ "type": "boolean",
439
+ "description": "Enable push events"
440
+ },
441
+ "issues_events": {
442
+ "type": "boolean",
443
+ "description": "Enable issues events"
444
+ },
445
+ "merge_requests_events": {
446
+ "type": "boolean",
447
+ "description": "Enable merge requests events"
448
+ }
449
+ }
450
+ },
451
+
452
+ {
453
+ "name": "update_content",
454
+ "description": "Update GitLab content. Actions: 'update_issue', 'update_merge_request', 'update_issue_note', 'update_merge_request_note', 'set_issue_discussion_resolved', 'update_file', 'retry_job', 'cancel_job', 'update_project_variable', 'update_project_hook'.",
455
+ "metadata_params": ["action", "project_id", "merge_request_iid", "issue_iid", "note_id", "job_id", "key", "hook_id"],
456
+ "operations": {
457
+ "update_issue": "putApiV4ProjectsIdIssuesIssueIid",
458
+ "update_merge_request": "putApiV4ProjectsIdMergeRequestsMergeRequestIid",
459
+ "update_issue_note": "putApiV4ProjectsIdIssuesIssueIidNotesNoteId",
460
+ "update_merge_request_note": "putApiV4ProjectsIdMergeRequestsMergeRequestIidNotesNoteId",
461
+ "set_issue_discussion_resolved": "putApiV4ProjectsIdIssuesIssueIidDiscussionsDiscussionId",
462
+ "update_file": "putApiV4ProjectsIdRepositoryFilesFilePath",
463
+ "retry_job": "postApiV4ProjectsIdJobsJobIdRetry",
464
+ "cancel_job": "postApiV4ProjectsIdJobsJobIdCancel",
465
+ "update_project_variable": "putApiV4ProjectsIdVariablesKey",
466
+ "update_project_hook": "putApiV4ProjectsIdHooksHookId"
467
+ },
468
+ "response_fields": {
469
+ "update_issue": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at", "updated_at"],
470
+ "update_merge_request": ["id", "iid", "title", "description", "state", "web_url", "author", "created_at", "updated_at"],
471
+ "update_issue_note": ["id", "body", "author", "created_at", "updated_at", "system", "confidential"],
472
+ "update_merge_request_note": ["id", "body", "author", "created_at", "updated_at", "system", "confidential"],
473
+ "set_issue_discussion_resolved": ["id", "notes", "resolved"],
474
+ "update_file": ["file_name", "file_path", "size", "encoding", "content", "ref", "blob_id", "commit_id", "last_commit_id"],
475
+ "update_project_variable": ["key", "value", "protected", "masked", "environment_scope"],
476
+ "update_project_hook": ["id", "url", "push_events", "issues_events", "merge_requests_events"]
477
+ },
478
+ "parameters": {
479
+ "action": {
480
+ "type": "string",
481
+ "enum": ["update_issue", "update_merge_request", "update_issue_note", "update_merge_request_note", "set_issue_discussion_resolved", "update_file", "retry_job", "cancel_job", "update_project_variable", "update_project_hook"],
482
+ "description": "Action to perform",
483
+ "required": true
484
+ },
485
+ "project_id": {
486
+ "type": "string",
487
+ "description": "Project ID. Use numeric ID (e.g. '123') or URL-encoded path (e.g. 'group%2Fproject').",
488
+ "required": true,
489
+ "example": "123"
490
+ },
491
+ "merge_request_iid": {
492
+ "type": "integer",
493
+ "description": "The internal ID of the merge request",
494
+ "required_for": ["update_merge_request", "update_merge_request_note"]
495
+ },
496
+ "issue_iid": {
497
+ "type": "integer",
498
+ "description": "The internal ID of the issue",
499
+ "required_for": ["update_issue", "update_issue_note", "set_issue_discussion_resolved"]
500
+ },
501
+ "note_id": {
502
+ "type": "integer",
503
+ "description": "The ID of the note",
504
+ "required_for": ["update_issue_note", "update_merge_request_note"]
505
+ },
506
+ "discussion_id": {
507
+ "type": "string",
508
+ "description": "The ID of the discussion",
509
+ "required_for": ["set_issue_discussion_resolved"]
510
+ },
511
+ "job_id": {
512
+ "type": "integer",
513
+ "description": "Job ID (for retry or cancel)",
514
+ "required_for": ["retry_job", "cancel_job"]
515
+ },
516
+ "key": {
517
+ "type": "string",
518
+ "description": "Project variable key",
519
+ "required_for": ["update_project_variable"]
520
+ },
521
+ "hook_id": {
522
+ "type": "integer",
523
+ "description": "Hook ID",
524
+ "required_for": ["update_project_hook"]
525
+ },
526
+ "title": {
527
+ "type": "string",
528
+ "description": "Title",
529
+ "example": "Update title"
530
+ },
531
+ "description": {
532
+ "type": "string",
533
+ "description": "Description"
534
+ },
535
+ "state_event": {
536
+ "type": "string",
537
+ "enum": ["reopen", "close"],
538
+ "description": "State event (update_issue or update_merge_request)"
539
+ },
540
+ "assignee_id": {
541
+ "type": "integer",
542
+ "description": "The ID of the user to assign the merge request to (optional for update_merge_request)"
543
+ },
544
+ "assignee_ids": {
545
+ "type": "array",
546
+ "items": { "type": "integer" },
547
+ "description": "The IDs of the users to assign the merge request to (optional for update_merge_request)"
548
+ },
549
+ "reviewer_ids": {
550
+ "type": "array",
551
+ "items": { "type": "integer" },
552
+ "description": "The IDs of the users to review the merge request (optional for update_merge_request)"
553
+ },
554
+ "body": {
555
+ "type": "string",
556
+ "description": "Note body",
557
+ "required_for": ["update_issue_note", "update_merge_request_note"],
558
+ "example": "Updating the comment."
559
+ },
560
+ "resolved": {
561
+ "type": "boolean",
562
+ "description": "Resolve or unresolve discussion",
563
+ "required_for": ["set_issue_discussion_resolved"]
564
+ },
565
+ "file_path": {
566
+ "type": "string",
567
+ "description": "URL-encoded full path to the file, e.g., 'src%2Findex.js'. Use %2F instead of '/'.",
568
+ "required_for": ["update_file"]
569
+ },
570
+ "branch": {
571
+ "type": "string",
572
+ "description": "Branch name for file operations",
573
+ "required_for": ["update_file"]
574
+ },
575
+ "content": {
576
+ "type": "string",
577
+ "description": "File content",
578
+ "required_for": ["update_file"]
579
+ },
580
+ "commit_message": {
581
+ "type": "string",
582
+ "description": "Commit message",
583
+ "required_for": ["update_file"]
584
+ },
585
+ "value": {
586
+ "type": "string",
587
+ "description": "Project variable value",
588
+ "required_for": ["update_project_variable"]
589
+ },
590
+ "protected": {
591
+ "type": "boolean",
592
+ "description": "Whether the variable is protected"
593
+ },
594
+ "masked": {
595
+ "type": "boolean",
596
+ "description": "Whether the variable is masked"
597
+ },
598
+ "environment_scope": {
599
+ "type": "string",
600
+ "description": "Environment scope for the variable"
601
+ },
602
+ "url": {
603
+ "type": "string",
604
+ "description": "Hook URL",
605
+ "required_for": ["update_project_hook"]
606
+ },
607
+ "push_events": {
608
+ "type": "boolean",
609
+ "description": "Enable push events"
610
+ },
611
+ "issues_events": {
612
+ "type": "boolean",
613
+ "description": "Enable issues events"
614
+ },
615
+ "merge_requests_events": {
616
+ "type": "boolean",
617
+ "description": "Enable merge requests events"
618
+ }
619
+ }
620
+ },
621
+
622
+ {
623
+ "name": "delete_content",
624
+ "description": "Delete GitLab content. Actions: 'delete_issue', 'delete_merge_request', 'delete_issue_note', 'delete_merge_request_note', 'delete_issue_discussion', 'delete_issue_note_award_emoji', 'delete_file', 'delete_project_variable', 'delete_project_hook'.",
625
+ "metadata_params": ["action", "project_id", "issue_iid", "merge_request_iid", "note_id", "discussion_id", "award_id", "file_path", "key", "hook_id"],
626
+ "operations": {
627
+ "delete_issue": "deleteApiV4ProjectsIdIssuesIssueIid",
628
+ "delete_merge_request": "deleteApiV4ProjectsIdMergeRequestsMergeRequestIid",
629
+ "delete_issue_note": "deleteApiV4ProjectsIdIssuesIssueIidNotesNoteId",
630
+ "delete_merge_request_note": "deleteApiV4ProjectsIdMergeRequestsMergeRequestIidNotesNoteId",
631
+ "delete_issue_discussion": "deleteApiV4ProjectsIdIssuesIssueIidDiscussionsDiscussionId",
632
+ "delete_issue_note_award_emoji": "deleteApiV4ProjectsIdIssuesIssueIidNotesNoteIdAwardEmojiAwardId",
633
+ "delete_file": "deleteApiV4ProjectsIdRepositoryFilesFilePath",
634
+ "delete_project_variable": "deleteApiV4ProjectsIdVariablesKey",
635
+ "delete_project_hook": "deleteApiV4ProjectsIdHooksHookId"
636
+ },
637
+ "parameters": {
638
+ "action": {
639
+ "type": "string",
640
+ "enum": ["delete_issue", "delete_merge_request", "delete_issue_note", "delete_merge_request_note", "delete_issue_discussion", "delete_issue_note_award_emoji", "delete_file", "delete_project_variable", "delete_project_hook"],
641
+ "description": "Action to perform",
642
+ "required": true
643
+ },
644
+ "project_id": {
645
+ "type": "string",
646
+ "description": "Project ID. Use numeric ID (e.g. '123') or URL-encoded path (e.g. 'group%2Fproject').",
647
+ "required": true,
648
+ "example": "123"
649
+ },
650
+ "issue_iid": {
651
+ "type": "integer",
652
+ "description": "The internal ID of the issue",
653
+ "required_for": ["delete_issue", "delete_issue_note"]
654
+ },
655
+ "merge_request_iid": {
656
+ "type": "integer",
657
+ "description": "The internal ID of the merge request",
658
+ "required_for": ["delete_merge_request", "delete_merge_request_note"]
659
+ },
660
+ "note_id": {
661
+ "type": "integer",
662
+ "description": "The ID of the note",
663
+ "required_for": ["delete_issue_note", "delete_merge_request_note", "delete_issue_note_award_emoji"]
664
+ },
665
+ "discussion_id": {
666
+ "type": "string",
667
+ "description": "The ID of the discussion",
668
+ "required_for": ["delete_issue_discussion"]
669
+ },
670
+ "award_id": {
671
+ "type": "integer",
672
+ "description": "The ID of the award emoji",
673
+ "required_for": ["delete_issue_note_award_emoji"]
674
+ },
675
+ "file_path": {
676
+ "type": "string",
677
+ "description": "URL-encoded full path to the file, e.g., 'src%2Findex.js'. Use %2F instead of '/'.",
678
+ "required_for": ["delete_file"]
679
+ },
680
+ "branch": {
681
+ "type": "string",
682
+ "description": "Branch name for file operations",
683
+ "required_for": ["delete_file"]
684
+ },
685
+ "commit_message": {
686
+ "type": "string",
687
+ "description": "Commit message",
688
+ "required_for": ["delete_file"]
689
+ },
690
+ "key": {
691
+ "type": "string",
692
+ "description": "Project variable key",
693
+ "required_for": ["delete_project_variable"]
694
+ },
695
+ "hook_id": {
696
+ "type": "integer",
697
+ "description": "Hook ID",
698
+ "required_for": ["delete_project_hook"]
699
+ }
700
+ }
701
+ },
702
+
703
+ {
704
+ "name": "run_glql",
705
+ "description": "Execute a GLQL query. Actions: 'query'.",
706
+ "metadata_params": ["action"],
707
+ "operations": {
708
+ "query": "postApiV4Glql"
709
+ },
710
+ "parameters": {
711
+ "action": {
712
+ "type": "string",
713
+ "enum": ["query"],
714
+ "description": "Action to perform",
715
+ "required": true
716
+ },
717
+ "query": {
718
+ "type": "string",
719
+ "description": "GLQL query string",
720
+ "required_for": ["query"],
721
+ "example": "{ projects { nodes { id name } } }"
722
+ }
723
+ }
724
+ }
725
+ ],
726
+
727
+ "interceptors": {
728
+ "array_format": "brackets",
729
+ "auth": [
730
+ {
731
+ "type": "oauth",
732
+ "priority": 0,
733
+ "validation_endpoint": "user",
734
+ "oauth_config": {
735
+ "issuer": "${env:GITLAB_OAUTH_ISSUER}",
736
+ "client_id": "${env:GITLAB_OAUTH_CLIENT_ID}",
737
+ "client_secret": "${env:GITLAB_OAUTH_CLIENT_SECRET}",
738
+ "scopes": ["api", "read_repository"],
739
+ "redirect_uri": "${env:GITLAB_OAUTH_REDIRECT_URI}"
740
+ }
741
+ },
742
+ {
743
+ "type": "bearer",
744
+ "priority": 1,
745
+ "value_from_env": "GITLAB_TOKEN",
746
+ "validation_endpoint": "personal_access_tokens/self"
747
+ }
748
+ ],
749
+ "base_url": {
750
+ "value_from_env": "GITLAB_API_BASE_URL",
751
+ "default": "https://gitlab.com/api/v4"
752
+ },
753
+ "rate_limit": {
754
+ "max_requests_per_minute": 600,
755
+ "overrides": {
756
+ "postApiV4ProjectsIdIssues": {
757
+ "max_requests_per_minute": 10
758
+ },
759
+ "deleteApiV4ProjectsIdIssuesIssueIid": {
760
+ "max_requests_per_minute": 5
761
+ },
762
+ "postApiV4ProjectsIdMergeRequests": {
763
+ "max_requests_per_minute": 10
764
+ },
765
+ "deleteApiV4ProjectsIdMergeRequestsMergeRequestIid": {
766
+ "max_requests_per_minute": 5
767
+ },
768
+ "postApiV4ProjectsIdMergeRequestsMergeRequestIidNotes": {
769
+ "max_requests_per_minute": 30
770
+ },
771
+ "putApiV4ProjectsIdMergeRequestsMergeRequestIidNotesNoteId": {
772
+ "max_requests_per_minute": 30
773
+ },
774
+ "deleteApiV4ProjectsIdMergeRequestsMergeRequestIidNotesNoteId": {
775
+ "max_requests_per_minute": 10
776
+ }
777
+ }
778
+ },
779
+ "retry": {
780
+ "max_attempts": 3,
781
+ "backoff_ms": [1000, 2000, 4000],
782
+ "retry_on_status": [429, 500, 502, 503, 504]
783
+ }
784
+ }
785
+ }