gitlab-api 26.1.1__tar.gz → 26.4.0__tar.gz
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.
- {gitlab_api-26.1.1/gitlab_api.egg-info → gitlab_api-26.4.0}/PKG-INFO +16 -6
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/README.md +14 -4
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/agent_server.py +1 -1
- gitlab_api-26.4.0/gitlab_api/api/api_client_vulnerabilities.py +168 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api_client.py +2 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/gitlab_input_models.py +63 -0
- gitlab_api-26.4.0/gitlab_api/kg_ingest.py +269 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/__init__.py +2 -0
- gitlab_api-26.4.0/gitlab_api/mcp/mcp_vulnerabilities.py +59 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp_server.py +111 -1
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/ontology/gitlab.ttl +59 -1
- gitlab_api-26.4.0/gitlab_api/skills/gitlab-vulnerabilities/SKILL.md +107 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0/gitlab_api.egg-info}/PKG-INFO +16 -6
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/SOURCES.txt +3 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/requires.txt +1 -1
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/pyproject.toml +2 -2
- gitlab_api-26.4.0/tests/test_kg_ingest.py +182 -0
- gitlab_api-26.1.1/gitlab_api/kg_ingest.py +0 -144
- gitlab_api-26.1.1/tests/test_kg_ingest.py +0 -93
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/LICENSE +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/MANIFEST.in +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/__init__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/__main__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/__init__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_base.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_environments.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_issues.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_merge_requests.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_other.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_pipelines.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_projects.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_repositories.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_system.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_users_groups.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/auth.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/connectors/__init__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/connectors/mcp_source_presets.json +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/gitlab_gql.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/gitlab_response_models.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/instances.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/main_agent.json +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_branches.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_commits.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_custom_api.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_deploy_tokens.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_environments.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_epics.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_graphql.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_graphql_ops.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_groups.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_issues.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_jobs.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_labels.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_members.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_merge_requests.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_merge_rules.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_milestones.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_misc.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_namespaces.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_notes.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_packages.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_pipeline_schedules.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_pipelines.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_projects.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_protected_branches.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_releases.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_runners.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_snippets.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_tags.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_users.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_wiki.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp_config.json +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/ontology/__init__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/prompts/__init__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/prompts/devops_specialist.json +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/prompts/main_agent.json +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/__init__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-issues/SKILL.md +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-merge-request-create/SKILL.md +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-merge-request-review/SKILL.md +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-pipelines/SKILL.md +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/dependency_links.txt +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/entry_points.txt +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/top_level.txt +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/requirements.txt +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/security_sanitizer.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/validate_a2a_agent.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/validate_agent.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/verify_api_integration.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/setup.cfg +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/__init__.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/conftest.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_action_discovery.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_api_wrapper.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_auth.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_concept_parity.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_a2a_validation.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_api_brute_force_coverage.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_gql.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_mcp_validation.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_models.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_init_dynamics.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_instances.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_mock_coverage.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_startup.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_tool_modes.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_verify_agent.py +0 -0
- {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/verify_a2a_queries.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gitlab-api
|
|
3
|
-
Version: 26.
|
|
3
|
+
Version: 26.4.0
|
|
4
4
|
Summary: GitLab API + MCP Server + A2A Server
|
|
5
5
|
Author-email: Audel Rouhi <knucklessg1@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -22,7 +22,7 @@ Requires-Dist: agent-utilities[agent,logfire]>=1.0.0; extra == "agent"
|
|
|
22
22
|
Provides-Extra: gql
|
|
23
23
|
Requires-Dist: gql[requests]>=4.0.0; extra == "gql"
|
|
24
24
|
Provides-Extra: all
|
|
25
|
-
Requires-Dist: gitlab-api[agent,gql,logfire,mcp]>=26.
|
|
25
|
+
Requires-Dist: gitlab-api[agent,gql,logfire,mcp]>=26.4.0; extra == "all"
|
|
26
26
|
Provides-Extra: test
|
|
27
27
|
Requires-Dist: pytest-xdist>=3.6.0; extra == "test"
|
|
28
28
|
Requires-Dist: pytest; extra == "test"
|
|
@@ -52,7 +52,7 @@ Dynamic: license-file
|
|
|
52
52
|

|
|
53
53
|

|
|
54
54
|
|
|
55
|
-
*Version: 26.
|
|
55
|
+
*Version: 26.4.0*
|
|
56
56
|
|
|
57
57
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
58
58
|
> interfaces, the integrated A2A agent server, and guidance for provisioning the
|
|
@@ -116,6 +116,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
116
116
|
| `gitlab_graphql` | `GRAPHQLTOOL` | Execute raw GraphQL queries and mutations natively on GitLab. |
|
|
117
117
|
| `gitlab_graphql_ops` | `GRAPHQL_OPSTOOL` | Run a typed GitLab GraphQL operation by name. |
|
|
118
118
|
| `gitlab_groups` | `GROUPSTOOL` | Manage gitlab groups operations. |
|
|
119
|
+
| `gitlab_ingest_pipelines` | `MISCTOOL` | Natively ingest GitLab CI pipeline runs (+ jobs) into epistemic-graph. |
|
|
119
120
|
| `gitlab_ingest_projects` | `MISCTOOL` | Natively ingest GitLab projects into epistemic-graph as typed :Project nodes. |
|
|
120
121
|
| `gitlab_instances` | `MISCTOOL` | List the configured GitLab tenants (CONCEPT:AU-KG.backend.declared-columns-so-schema). |
|
|
121
122
|
| `gitlab_issues` | `ISSUESTOOL` | Manage GitLab issues. |
|
|
@@ -137,12 +138,13 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
137
138
|
| `gitlab_snippets` | `SNIPPETSTOOL` | Manage GitLab snippets. |
|
|
138
139
|
| `gitlab_tags` | `TAGSTOOL` | Manage gitlab tags operations. |
|
|
139
140
|
| `gitlab_users` | `USERSTOOL` | Manage gitlab users operations. |
|
|
141
|
+
| `gitlab_vulnerabilities` | `VULNERABILITIESTOOL` | Review a project's dependency list and security vulnerabilities (the GitLab counterpart to GitHub Dependabot). |
|
|
140
142
|
| `gitlab_wiki` | `WIKITOOL` | Manage gitlab wiki operations. |
|
|
141
143
|
|
|
142
144
|
#### Verbose 1:1 API-mapped tools (`MCP_TOOL_MODE=verbose` or `both`)
|
|
143
145
|
|
|
144
146
|
<details>
|
|
145
|
-
<summary>
|
|
147
|
+
<summary>196 per-operation tools — one per public API method (click to expand)</summary>
|
|
146
148
|
|
|
147
149
|
| MCP Tool | Toggle Env Var | Description |
|
|
148
150
|
|----------|----------------|-------------|
|
|
@@ -236,6 +238,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
236
238
|
| `gitlab_get_group_releases` | `USERS_GROUPSTOOL` | Get information about releases in a group. |
|
|
237
239
|
| `gitlab_get_group_runners` | `PIPELINESTOOL` | Get information about runners in a group. |
|
|
238
240
|
| `gitlab_get_group_subgroups` | `USERS_GROUPSTOOL` | Get subgroups of a specific group. |
|
|
241
|
+
| `gitlab_get_group_vulnerabilities` | `VULNERABILITIESTOOL` | Get a group's security vulnerability findings (Ultimate). |
|
|
239
242
|
| `gitlab_get_groups` | `USERS_GROUPSTOOL` | Get a list of groups. |
|
|
240
243
|
| `gitlab_get_issue` | `ISSUESTOOL` | Get a single issue. |
|
|
241
244
|
| `gitlab_get_issues` | `ISSUESTOOL` | Get list of issues. Can filter by project_id. |
|
|
@@ -261,6 +264,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
261
264
|
| `gitlab_get_pipelines_triggered_from_schedule` | `PIPELINESTOOL` | Get pipelines triggered from a specific pipeline schedule. |
|
|
262
265
|
| `gitlab_get_project` | `PROJECTSTOOL` | Get information about a specific project. |
|
|
263
266
|
| `gitlab_get_project_contributors` | `PROJECTSTOOL` | Get information about contributors to a project. |
|
|
267
|
+
| `gitlab_get_project_dependencies` | `VULNERABILITIESTOOL` | Get a project's Dependency List (all detected dependencies). |
|
|
264
268
|
| `gitlab_get_project_deploy_token` | `PROJECTSTOOL` | Get a specific deploy token for a project. |
|
|
265
269
|
| `gitlab_get_project_deploy_tokens` | `PROJECTSTOOL` | Get deploy tokens for a specific project. |
|
|
266
270
|
| `gitlab_get_project_groups` | `PROJECTSTOOL` | Get groups associated with a specific project. |
|
|
@@ -275,6 +279,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
275
279
|
| `gitlab_get_project_merge_requests` | `PROJECTSTOOL` | Get merge requests for a specific project. |
|
|
276
280
|
| `gitlab_get_project_runners` | `PROJECTSTOOL` | Get information about runners in a project. |
|
|
277
281
|
| `gitlab_get_project_statistics` | `PROJECTSTOOL` | Get statistics for a specific project. |
|
|
282
|
+
| `gitlab_get_project_vulnerabilities` | `VULNERABILITIESTOOL` | Get a project's security vulnerabilities (Ultimate). |
|
|
278
283
|
| `gitlab_get_projects` | `PROJECTSTOOL` | Get information about projects. |
|
|
279
284
|
| `gitlab_get_protected_branch` | `REPOSITORIESTOOL` | Get information about a specific protected branch in a project. |
|
|
280
285
|
| `gitlab_get_protected_branches` | `REPOSITORIESTOOL` | Get information about protected branches in a project. |
|
|
@@ -294,6 +299,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
294
299
|
| `gitlab_get_tags` | `REPOSITORIESTOOL` | Get information about tags in a project. |
|
|
295
300
|
| `gitlab_get_user` | `USERS_GROUPSTOOL` | Get information about a specific user. |
|
|
296
301
|
| `gitlab_get_users` | `USERS_GROUPSTOOL` | Get information about users. |
|
|
302
|
+
| `gitlab_get_vulnerability` | `VULNERABILITIESTOOL` | Get a single vulnerability by its global ID (Ultimate). |
|
|
297
303
|
| `gitlab_get_wiki_list` | `OTHERTOOL` | Get a list of wiki pages for a project. |
|
|
298
304
|
| `gitlab_get_wiki_page` | `OTHERTOOL` | Get information about a specific wiki page. |
|
|
299
305
|
| `gitlab_merge_request_level_approvals` | `MERGE_REQUESTSTOOL` | Get approvals for a specific merge request. |
|
|
@@ -341,7 +347,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
341
347
|
|
|
342
348
|
</details>
|
|
343
349
|
|
|
344
|
-
|
|
350
|
+
_34 action-routed tool(s) (default) · 196 verbose 1:1 tool(s). Each is enabled unless its `<DOMAIN>TOOL` toggle is set false; `MCP_TOOL_MODE` selects the surface (`condensed` default · `verbose` 1:1 · `both`). Auto-generated — do not edit._
|
|
345
351
|
<!-- MCP-TOOLS-TABLE:END -->
|
|
346
352
|
|
|
347
353
|
Detailed tool schemas, parameter shapes, and validation constraints are preserved in [docs/mcp.md](docs/mcp.md).
|
|
@@ -422,6 +428,7 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
422
428
|
"SNIPPETSTOOL": "True",
|
|
423
429
|
"TAGSTOOL": "True",
|
|
424
430
|
"USERSTOOL": "True",
|
|
431
|
+
"VULNERABILITIESTOOL": "True",
|
|
425
432
|
"WIKITOOL": "True"
|
|
426
433
|
}
|
|
427
434
|
}
|
|
@@ -481,6 +488,7 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
481
488
|
"SNIPPETSTOOL": "True",
|
|
482
489
|
"TAGSTOOL": "True",
|
|
483
490
|
"USERSTOOL": "True",
|
|
491
|
+
"VULNERABILITIESTOOL": "True",
|
|
484
492
|
"WIKITOOL": "True"
|
|
485
493
|
}
|
|
486
494
|
}
|
|
@@ -541,6 +549,7 @@ docker run -d \
|
|
|
541
549
|
-e SNIPPETSTOOL=True \
|
|
542
550
|
-e TAGSTOOL=True \
|
|
543
551
|
-e USERSTOOL=True \
|
|
552
|
+
-e VULNERABILITIESTOOL=True \
|
|
544
553
|
-e WIKITOOL=True \
|
|
545
554
|
knucklessg1/gitlab-api:mcp
|
|
546
555
|
```
|
|
@@ -613,6 +622,7 @@ consumed from a **remote deployment**. The
|
|
|
613
622
|
| `SNIPPETSTOOL` | `True` | |
|
|
614
623
|
| `TAGSTOOL` | `True` | |
|
|
615
624
|
| `USERSTOOL` | `True` | |
|
|
625
|
+
| `VULNERABILITIESTOOL` | `True` | |
|
|
616
626
|
| `WIKITOOL` | `True` | |
|
|
617
627
|
| `CUSTOM_APITOOL` | `True` | |
|
|
618
628
|
| `GRAPHQLTOOL` | `True` | |
|
|
@@ -637,7 +647,7 @@ consumed from a **remote deployment**. The
|
|
|
637
647
|
| `MODEL_ID` | `gpt-4o` | Model id for the agent |
|
|
638
648
|
| `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
|
|
639
649
|
|
|
640
|
-
|
|
650
|
+
_45 package + 14 inherited variable(s). Auto-generated from `.env.example` + the shared agent-utilities set — do not edit._
|
|
641
651
|
<!-- ENV-VARS-TABLE:END -->
|
|
642
652
|
|
|
643
653
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|

|
|
21
21
|

|
|
22
22
|
|
|
23
|
-
*Version: 26.
|
|
23
|
+
*Version: 26.4.0*
|
|
24
24
|
|
|
25
25
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
26
26
|
> interfaces, the integrated A2A agent server, and guidance for provisioning the
|
|
@@ -84,6 +84,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
84
84
|
| `gitlab_graphql` | `GRAPHQLTOOL` | Execute raw GraphQL queries and mutations natively on GitLab. |
|
|
85
85
|
| `gitlab_graphql_ops` | `GRAPHQL_OPSTOOL` | Run a typed GitLab GraphQL operation by name. |
|
|
86
86
|
| `gitlab_groups` | `GROUPSTOOL` | Manage gitlab groups operations. |
|
|
87
|
+
| `gitlab_ingest_pipelines` | `MISCTOOL` | Natively ingest GitLab CI pipeline runs (+ jobs) into epistemic-graph. |
|
|
87
88
|
| `gitlab_ingest_projects` | `MISCTOOL` | Natively ingest GitLab projects into epistemic-graph as typed :Project nodes. |
|
|
88
89
|
| `gitlab_instances` | `MISCTOOL` | List the configured GitLab tenants (CONCEPT:AU-KG.backend.declared-columns-so-schema). |
|
|
89
90
|
| `gitlab_issues` | `ISSUESTOOL` | Manage GitLab issues. |
|
|
@@ -105,12 +106,13 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
105
106
|
| `gitlab_snippets` | `SNIPPETSTOOL` | Manage GitLab snippets. |
|
|
106
107
|
| `gitlab_tags` | `TAGSTOOL` | Manage gitlab tags operations. |
|
|
107
108
|
| `gitlab_users` | `USERSTOOL` | Manage gitlab users operations. |
|
|
109
|
+
| `gitlab_vulnerabilities` | `VULNERABILITIESTOOL` | Review a project's dependency list and security vulnerabilities (the GitLab counterpart to GitHub Dependabot). |
|
|
108
110
|
| `gitlab_wiki` | `WIKITOOL` | Manage gitlab wiki operations. |
|
|
109
111
|
|
|
110
112
|
#### Verbose 1:1 API-mapped tools (`MCP_TOOL_MODE=verbose` or `both`)
|
|
111
113
|
|
|
112
114
|
<details>
|
|
113
|
-
<summary>
|
|
115
|
+
<summary>196 per-operation tools — one per public API method (click to expand)</summary>
|
|
114
116
|
|
|
115
117
|
| MCP Tool | Toggle Env Var | Description |
|
|
116
118
|
|----------|----------------|-------------|
|
|
@@ -204,6 +206,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
204
206
|
| `gitlab_get_group_releases` | `USERS_GROUPSTOOL` | Get information about releases in a group. |
|
|
205
207
|
| `gitlab_get_group_runners` | `PIPELINESTOOL` | Get information about runners in a group. |
|
|
206
208
|
| `gitlab_get_group_subgroups` | `USERS_GROUPSTOOL` | Get subgroups of a specific group. |
|
|
209
|
+
| `gitlab_get_group_vulnerabilities` | `VULNERABILITIESTOOL` | Get a group's security vulnerability findings (Ultimate). |
|
|
207
210
|
| `gitlab_get_groups` | `USERS_GROUPSTOOL` | Get a list of groups. |
|
|
208
211
|
| `gitlab_get_issue` | `ISSUESTOOL` | Get a single issue. |
|
|
209
212
|
| `gitlab_get_issues` | `ISSUESTOOL` | Get list of issues. Can filter by project_id. |
|
|
@@ -229,6 +232,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
229
232
|
| `gitlab_get_pipelines_triggered_from_schedule` | `PIPELINESTOOL` | Get pipelines triggered from a specific pipeline schedule. |
|
|
230
233
|
| `gitlab_get_project` | `PROJECTSTOOL` | Get information about a specific project. |
|
|
231
234
|
| `gitlab_get_project_contributors` | `PROJECTSTOOL` | Get information about contributors to a project. |
|
|
235
|
+
| `gitlab_get_project_dependencies` | `VULNERABILITIESTOOL` | Get a project's Dependency List (all detected dependencies). |
|
|
232
236
|
| `gitlab_get_project_deploy_token` | `PROJECTSTOOL` | Get a specific deploy token for a project. |
|
|
233
237
|
| `gitlab_get_project_deploy_tokens` | `PROJECTSTOOL` | Get deploy tokens for a specific project. |
|
|
234
238
|
| `gitlab_get_project_groups` | `PROJECTSTOOL` | Get groups associated with a specific project. |
|
|
@@ -243,6 +247,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
243
247
|
| `gitlab_get_project_merge_requests` | `PROJECTSTOOL` | Get merge requests for a specific project. |
|
|
244
248
|
| `gitlab_get_project_runners` | `PROJECTSTOOL` | Get information about runners in a project. |
|
|
245
249
|
| `gitlab_get_project_statistics` | `PROJECTSTOOL` | Get statistics for a specific project. |
|
|
250
|
+
| `gitlab_get_project_vulnerabilities` | `VULNERABILITIESTOOL` | Get a project's security vulnerabilities (Ultimate). |
|
|
246
251
|
| `gitlab_get_projects` | `PROJECTSTOOL` | Get information about projects. |
|
|
247
252
|
| `gitlab_get_protected_branch` | `REPOSITORIESTOOL` | Get information about a specific protected branch in a project. |
|
|
248
253
|
| `gitlab_get_protected_branches` | `REPOSITORIESTOOL` | Get information about protected branches in a project. |
|
|
@@ -262,6 +267,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
262
267
|
| `gitlab_get_tags` | `REPOSITORIESTOOL` | Get information about tags in a project. |
|
|
263
268
|
| `gitlab_get_user` | `USERS_GROUPSTOOL` | Get information about a specific user. |
|
|
264
269
|
| `gitlab_get_users` | `USERS_GROUPSTOOL` | Get information about users. |
|
|
270
|
+
| `gitlab_get_vulnerability` | `VULNERABILITIESTOOL` | Get a single vulnerability by its global ID (Ultimate). |
|
|
265
271
|
| `gitlab_get_wiki_list` | `OTHERTOOL` | Get a list of wiki pages for a project. |
|
|
266
272
|
| `gitlab_get_wiki_page` | `OTHERTOOL` | Get information about a specific wiki page. |
|
|
267
273
|
| `gitlab_merge_request_level_approvals` | `MERGE_REQUESTSTOOL` | Get approvals for a specific merge request. |
|
|
@@ -309,7 +315,7 @@ _Auto-generated from the live MCP server — do not edit by hand._
|
|
|
309
315
|
|
|
310
316
|
</details>
|
|
311
317
|
|
|
312
|
-
|
|
318
|
+
_34 action-routed tool(s) (default) · 196 verbose 1:1 tool(s). Each is enabled unless its `<DOMAIN>TOOL` toggle is set false; `MCP_TOOL_MODE` selects the surface (`condensed` default · `verbose` 1:1 · `both`). Auto-generated — do not edit._
|
|
313
319
|
<!-- MCP-TOOLS-TABLE:END -->
|
|
314
320
|
|
|
315
321
|
Detailed tool schemas, parameter shapes, and validation constraints are preserved in [docs/mcp.md](docs/mcp.md).
|
|
@@ -390,6 +396,7 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
390
396
|
"SNIPPETSTOOL": "True",
|
|
391
397
|
"TAGSTOOL": "True",
|
|
392
398
|
"USERSTOOL": "True",
|
|
399
|
+
"VULNERABILITIESTOOL": "True",
|
|
393
400
|
"WIKITOOL": "True"
|
|
394
401
|
}
|
|
395
402
|
}
|
|
@@ -449,6 +456,7 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
|
|
|
449
456
|
"SNIPPETSTOOL": "True",
|
|
450
457
|
"TAGSTOOL": "True",
|
|
451
458
|
"USERSTOOL": "True",
|
|
459
|
+
"VULNERABILITIESTOOL": "True",
|
|
452
460
|
"WIKITOOL": "True"
|
|
453
461
|
}
|
|
454
462
|
}
|
|
@@ -509,6 +517,7 @@ docker run -d \
|
|
|
509
517
|
-e SNIPPETSTOOL=True \
|
|
510
518
|
-e TAGSTOOL=True \
|
|
511
519
|
-e USERSTOOL=True \
|
|
520
|
+
-e VULNERABILITIESTOOL=True \
|
|
512
521
|
-e WIKITOOL=True \
|
|
513
522
|
knucklessg1/gitlab-api:mcp
|
|
514
523
|
```
|
|
@@ -581,6 +590,7 @@ consumed from a **remote deployment**. The
|
|
|
581
590
|
| `SNIPPETSTOOL` | `True` | |
|
|
582
591
|
| `TAGSTOOL` | `True` | |
|
|
583
592
|
| `USERSTOOL` | `True` | |
|
|
593
|
+
| `VULNERABILITIESTOOL` | `True` | |
|
|
584
594
|
| `WIKITOOL` | `True` | |
|
|
585
595
|
| `CUSTOM_APITOOL` | `True` | |
|
|
586
596
|
| `GRAPHQLTOOL` | `True` | |
|
|
@@ -605,7 +615,7 @@ consumed from a **remote deployment**. The
|
|
|
605
615
|
| `MODEL_ID` | `gpt-4o` | Model id for the agent |
|
|
606
616
|
| `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
|
|
607
617
|
|
|
608
|
-
|
|
618
|
+
_45 package + 14 inherited variable(s). Auto-generated from `.env.example` + the shared agent-utilities set — do not edit._
|
|
609
619
|
<!-- ENV-VARS-TABLE:END -->
|
|
610
620
|
|
|
611
621
|
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
|
|
3
|
+
from typing import TypeVar
|
|
4
|
+
|
|
5
|
+
import requests
|
|
6
|
+
from agent_utilities.base_utilities import get_logger
|
|
7
|
+
from pydantic import ValidationError
|
|
8
|
+
|
|
9
|
+
logger = get_logger(__name__)
|
|
10
|
+
|
|
11
|
+
from agent_utilities.core.exceptions import (
|
|
12
|
+
MissingParameterError,
|
|
13
|
+
ParameterError,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from gitlab_api.gitlab_input_models import (
|
|
17
|
+
VulnerabilityModel,
|
|
18
|
+
)
|
|
19
|
+
from gitlab_api.gitlab_response_models import (
|
|
20
|
+
Response,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
T = TypeVar("T")
|
|
24
|
+
|
|
25
|
+
from gitlab_api.api.api_client_base import GitLabApiBase
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class GitLabApiVulnerabilities(GitLabApiBase):
|
|
29
|
+
"""Dependency list + security vulnerability surface — the GitLab counterpart
|
|
30
|
+
to GitHub's Dependabot (Dependency List, Vulnerabilities, and findings APIs)."""
|
|
31
|
+
|
|
32
|
+
def get_project_dependencies(self, **kwargs) -> Response:
|
|
33
|
+
"""
|
|
34
|
+
Get a project's Dependency List (all detected dependencies).
|
|
35
|
+
|
|
36
|
+
GET /projects/{project_id}/dependencies
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
**kwargs: project_id (required); optional package_manager filter and
|
|
40
|
+
pagination (page, per_page, max_pages).
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Response: wrapper containing the original response and the parsed
|
|
44
|
+
dependency list (list of dicts).
|
|
45
|
+
|
|
46
|
+
Raises:
|
|
47
|
+
MissingParameterError: If project_id is missing.
|
|
48
|
+
ParameterError: If invalid parameters are provided.
|
|
49
|
+
"""
|
|
50
|
+
vulnerability = VulnerabilityModel(**kwargs)
|
|
51
|
+
if vulnerability.project_id is None:
|
|
52
|
+
raise MissingParameterError("project_id is required")
|
|
53
|
+
try:
|
|
54
|
+
response, data = self._fetch_all_pages(
|
|
55
|
+
endpoint=f"/projects/{vulnerability.project_id}/dependencies",
|
|
56
|
+
model=vulnerability,
|
|
57
|
+
id_field="project_id",
|
|
58
|
+
id_value=vulnerability.project_id,
|
|
59
|
+
)
|
|
60
|
+
return Response(response=response, data=data)
|
|
61
|
+
except ValidationError as e:
|
|
62
|
+
raise ParameterError(f"Invalid parameters: {e.errors()}") from e
|
|
63
|
+
except requests.RequestException as e:
|
|
64
|
+
raise ParameterError(f"Failed to get project dependencies: {str(e)}") from e
|
|
65
|
+
|
|
66
|
+
def get_project_vulnerabilities(self, **kwargs) -> Response:
|
|
67
|
+
"""
|
|
68
|
+
Get a project's security vulnerabilities (Ultimate).
|
|
69
|
+
|
|
70
|
+
GET /projects/{project_id}/vulnerabilities
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
**kwargs: project_id (required); optional pagination.
|
|
74
|
+
|
|
75
|
+
Returns:
|
|
76
|
+
Response: wrapper containing the original response and the parsed
|
|
77
|
+
vulnerabilities (list of dicts).
|
|
78
|
+
|
|
79
|
+
Raises:
|
|
80
|
+
MissingParameterError: If project_id is missing.
|
|
81
|
+
ParameterError: If invalid parameters are provided.
|
|
82
|
+
"""
|
|
83
|
+
vulnerability = VulnerabilityModel(**kwargs)
|
|
84
|
+
if vulnerability.project_id is None:
|
|
85
|
+
raise MissingParameterError("project_id is required")
|
|
86
|
+
try:
|
|
87
|
+
response, data = self._fetch_all_pages(
|
|
88
|
+
endpoint=f"/projects/{vulnerability.project_id}/vulnerabilities",
|
|
89
|
+
model=vulnerability,
|
|
90
|
+
id_field="project_id",
|
|
91
|
+
id_value=vulnerability.project_id,
|
|
92
|
+
)
|
|
93
|
+
return Response(response=response, data=data)
|
|
94
|
+
except ValidationError as e:
|
|
95
|
+
raise ParameterError(f"Invalid parameters: {e.errors()}") from e
|
|
96
|
+
except requests.RequestException as e:
|
|
97
|
+
raise ParameterError(
|
|
98
|
+
f"Failed to get project vulnerabilities: {str(e)}"
|
|
99
|
+
) from e
|
|
100
|
+
|
|
101
|
+
def get_group_vulnerabilities(self, **kwargs) -> Response:
|
|
102
|
+
"""
|
|
103
|
+
Get a group's security vulnerability findings (Ultimate).
|
|
104
|
+
|
|
105
|
+
GET /groups/{group_id}/vulnerability_findings
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
**kwargs: group_id (required); optional pagination.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Response: wrapper containing the original response and the parsed
|
|
112
|
+
vulnerability findings (list of dicts).
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
MissingParameterError: If group_id is missing.
|
|
116
|
+
ParameterError: If invalid parameters are provided.
|
|
117
|
+
"""
|
|
118
|
+
vulnerability = VulnerabilityModel(**kwargs)
|
|
119
|
+
if vulnerability.group_id is None:
|
|
120
|
+
raise MissingParameterError("group_id is required")
|
|
121
|
+
try:
|
|
122
|
+
response, data = self._fetch_all_pages(
|
|
123
|
+
endpoint=f"/groups/{vulnerability.group_id}/vulnerability_findings",
|
|
124
|
+
model=vulnerability,
|
|
125
|
+
id_field="group_id",
|
|
126
|
+
id_value=vulnerability.group_id,
|
|
127
|
+
)
|
|
128
|
+
return Response(response=response, data=data)
|
|
129
|
+
except ValidationError as e:
|
|
130
|
+
raise ParameterError(f"Invalid parameters: {e.errors()}") from e
|
|
131
|
+
except requests.RequestException as e:
|
|
132
|
+
raise ParameterError(
|
|
133
|
+
f"Failed to get group vulnerabilities: {str(e)}"
|
|
134
|
+
) from e
|
|
135
|
+
|
|
136
|
+
def get_vulnerability(self, **kwargs) -> Response:
|
|
137
|
+
"""
|
|
138
|
+
Get a single vulnerability by its global ID (Ultimate).
|
|
139
|
+
|
|
140
|
+
GET /vulnerabilities/{vulnerability_id}
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
**kwargs: vulnerability_id (required).
|
|
144
|
+
|
|
145
|
+
Returns:
|
|
146
|
+
Response: wrapper containing the original response and the parsed
|
|
147
|
+
vulnerability (dict).
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
MissingParameterError: If vulnerability_id is missing.
|
|
151
|
+
ParameterError: If invalid parameters are provided.
|
|
152
|
+
"""
|
|
153
|
+
vulnerability = VulnerabilityModel(**kwargs)
|
|
154
|
+
if vulnerability.vulnerability_id is None:
|
|
155
|
+
raise MissingParameterError("vulnerability_id is required")
|
|
156
|
+
try:
|
|
157
|
+
response = self._session.get(
|
|
158
|
+
url=f"{self.url}/vulnerabilities/{vulnerability.vulnerability_id}",
|
|
159
|
+
headers=self.headers,
|
|
160
|
+
verify=self.verify,
|
|
161
|
+
proxies=self.proxies,
|
|
162
|
+
)
|
|
163
|
+
response.raise_for_status()
|
|
164
|
+
return Response(response=response, data=response.json())
|
|
165
|
+
except ValidationError as e:
|
|
166
|
+
raise ParameterError(f"Invalid parameters: {e.errors()}") from e
|
|
167
|
+
except requests.RequestException as e:
|
|
168
|
+
raise ParameterError(f"Failed to get vulnerability: {str(e)}") from e
|
|
@@ -18,6 +18,7 @@ from gitlab_api.api.api_client_projects import GitLabApiProjects
|
|
|
18
18
|
from gitlab_api.api.api_client_repositories import GitLabApiRepositories
|
|
19
19
|
from gitlab_api.api.api_client_system import GitLabApiSystem
|
|
20
20
|
from gitlab_api.api.api_client_users_groups import GitLabApiUsersGroups
|
|
21
|
+
from gitlab_api.api.api_client_vulnerabilities import GitLabApiVulnerabilities
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
class Api(
|
|
@@ -29,6 +30,7 @@ class Api(
|
|
|
29
30
|
GitLabApiPipelines,
|
|
30
31
|
GitLabApiUsersGroups,
|
|
31
32
|
GitLabApiEnvironments,
|
|
33
|
+
GitLabApiVulnerabilities,
|
|
32
34
|
GitLabApiOther,
|
|
33
35
|
):
|
|
34
36
|
__slots__ = ()
|
|
@@ -3442,6 +3442,69 @@ class NoteModel(BaseModel):
|
|
|
3442
3442
|
return values
|
|
3443
3443
|
|
|
3444
3444
|
|
|
3445
|
+
class VulnerabilityModel(BaseModel):
|
|
3446
|
+
"""
|
|
3447
|
+
Pydantic model for the dependency list / security vulnerability surface
|
|
3448
|
+
(the GitLab counterpart to GitHub Dependabot).
|
|
3449
|
+
|
|
3450
|
+
Attributes:
|
|
3451
|
+
- project_id (int | str): Project ID or full path (dependencies / project vulnerabilities).
|
|
3452
|
+
- group_id (int | str): Group ID or full path (group vulnerability findings).
|
|
3453
|
+
- vulnerability_id (int | str): ID of a single vulnerability (global endpoint).
|
|
3454
|
+
- package_manager (str): Optional Dependency List filter (e.g. 'bundler', 'npm').
|
|
3455
|
+
"""
|
|
3456
|
+
|
|
3457
|
+
project_id: int | str | None = Field(
|
|
3458
|
+
default=None, description="Project ID or full path"
|
|
3459
|
+
)
|
|
3460
|
+
group_id: int | str | None = Field(
|
|
3461
|
+
default=None, description="Group ID or full path"
|
|
3462
|
+
)
|
|
3463
|
+
vulnerability_id: int | str | None = Field(
|
|
3464
|
+
default=None, description="ID of a single vulnerability"
|
|
3465
|
+
)
|
|
3466
|
+
package_manager: str | None = Field(
|
|
3467
|
+
default=None,
|
|
3468
|
+
description="Dependency List filter by package manager (e.g. 'npm', 'bundler')",
|
|
3469
|
+
)
|
|
3470
|
+
max_pages: int | None = Field(description="Maximum pages to return", default=None)
|
|
3471
|
+
per_page: int | None = Field(description="Results per page", default=None)
|
|
3472
|
+
page: int | None = Field(description="Pagination page", default=None)
|
|
3473
|
+
api_parameters: dict | None = Field(description="API Parameters", default=None)
|
|
3474
|
+
data: dict | None = Field(description="Data Payload", default=None)
|
|
3475
|
+
|
|
3476
|
+
def model_post_init(self, _context):
|
|
3477
|
+
self.api_parameters = {}
|
|
3478
|
+
if self.package_manager:
|
|
3479
|
+
self.api_parameters["package_manager"] = self.package_manager
|
|
3480
|
+
if self.page:
|
|
3481
|
+
self.api_parameters["page"] = self.page
|
|
3482
|
+
if self.per_page:
|
|
3483
|
+
self.api_parameters["per_page"] = self.per_page
|
|
3484
|
+
|
|
3485
|
+
@field_validator("project_id")
|
|
3486
|
+
def validate_project_id(cls, v):
|
|
3487
|
+
if v is None:
|
|
3488
|
+
return v
|
|
3489
|
+
if not str(v).strip():
|
|
3490
|
+
raise ValueError("Project ID or path cannot be empty")
|
|
3491
|
+
return str(v).strip("'\"")
|
|
3492
|
+
|
|
3493
|
+
@field_validator("group_id")
|
|
3494
|
+
def validate_group_id(cls, v):
|
|
3495
|
+
if v is None:
|
|
3496
|
+
return v
|
|
3497
|
+
if not str(v).strip():
|
|
3498
|
+
raise ValueError("Group ID or path cannot be empty")
|
|
3499
|
+
return str(v).strip("'\"")
|
|
3500
|
+
|
|
3501
|
+
@field_validator("vulnerability_id")
|
|
3502
|
+
def validate_vulnerability_id(cls, v):
|
|
3503
|
+
if v is None:
|
|
3504
|
+
return v
|
|
3505
|
+
return str(v).strip("'\"")
|
|
3506
|
+
|
|
3507
|
+
|
|
3445
3508
|
class EpicModel(BaseModel):
|
|
3446
3509
|
group_id: int | str | None = Field(
|
|
3447
3510
|
default=None, description="Group ID or full path"
|