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.
Files changed (108) hide show
  1. {gitlab_api-26.1.1/gitlab_api.egg-info → gitlab_api-26.4.0}/PKG-INFO +16 -6
  2. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/README.md +14 -4
  3. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/agent_server.py +1 -1
  4. gitlab_api-26.4.0/gitlab_api/api/api_client_vulnerabilities.py +168 -0
  5. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api_client.py +2 -0
  6. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/gitlab_input_models.py +63 -0
  7. gitlab_api-26.4.0/gitlab_api/kg_ingest.py +269 -0
  8. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/__init__.py +2 -0
  9. gitlab_api-26.4.0/gitlab_api/mcp/mcp_vulnerabilities.py +59 -0
  10. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp_server.py +111 -1
  11. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/ontology/gitlab.ttl +59 -1
  12. gitlab_api-26.4.0/gitlab_api/skills/gitlab-vulnerabilities/SKILL.md +107 -0
  13. {gitlab_api-26.1.1 → gitlab_api-26.4.0/gitlab_api.egg-info}/PKG-INFO +16 -6
  14. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/SOURCES.txt +3 -0
  15. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/requires.txt +1 -1
  16. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/pyproject.toml +2 -2
  17. gitlab_api-26.4.0/tests/test_kg_ingest.py +182 -0
  18. gitlab_api-26.1.1/gitlab_api/kg_ingest.py +0 -144
  19. gitlab_api-26.1.1/tests/test_kg_ingest.py +0 -93
  20. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/LICENSE +0 -0
  21. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/MANIFEST.in +0 -0
  22. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/__init__.py +0 -0
  23. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/__main__.py +0 -0
  24. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/__init__.py +0 -0
  25. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_base.py +0 -0
  26. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_environments.py +0 -0
  27. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_issues.py +0 -0
  28. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_merge_requests.py +0 -0
  29. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_other.py +0 -0
  30. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_pipelines.py +0 -0
  31. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_projects.py +0 -0
  32. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_repositories.py +0 -0
  33. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_system.py +0 -0
  34. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/api/api_client_users_groups.py +0 -0
  35. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/auth.py +0 -0
  36. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/connectors/__init__.py +0 -0
  37. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/connectors/mcp_source_presets.json +0 -0
  38. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/gitlab_gql.py +0 -0
  39. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/gitlab_response_models.py +0 -0
  40. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/instances.py +0 -0
  41. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/main_agent.json +0 -0
  42. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_branches.py +0 -0
  43. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_commits.py +0 -0
  44. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_custom_api.py +0 -0
  45. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_deploy_tokens.py +0 -0
  46. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_environments.py +0 -0
  47. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_epics.py +0 -0
  48. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_graphql.py +0 -0
  49. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_graphql_ops.py +0 -0
  50. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_groups.py +0 -0
  51. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_issues.py +0 -0
  52. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_jobs.py +0 -0
  53. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_labels.py +0 -0
  54. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_members.py +0 -0
  55. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_merge_requests.py +0 -0
  56. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_merge_rules.py +0 -0
  57. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_milestones.py +0 -0
  58. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_misc.py +0 -0
  59. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_namespaces.py +0 -0
  60. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_notes.py +0 -0
  61. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_packages.py +0 -0
  62. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_pipeline_schedules.py +0 -0
  63. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_pipelines.py +0 -0
  64. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_projects.py +0 -0
  65. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_protected_branches.py +0 -0
  66. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_releases.py +0 -0
  67. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_runners.py +0 -0
  68. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_snippets.py +0 -0
  69. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_tags.py +0 -0
  70. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_users.py +0 -0
  71. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp/mcp_wiki.py +0 -0
  72. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/mcp_config.json +0 -0
  73. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/ontology/__init__.py +0 -0
  74. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/prompts/__init__.py +0 -0
  75. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/prompts/devops_specialist.json +0 -0
  76. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/prompts/main_agent.json +0 -0
  77. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/__init__.py +0 -0
  78. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-issues/SKILL.md +0 -0
  79. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-merge-request-create/SKILL.md +0 -0
  80. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-merge-request-review/SKILL.md +0 -0
  81. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api/skills/gitlab-pipelines/SKILL.md +0 -0
  82. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/dependency_links.txt +0 -0
  83. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/entry_points.txt +0 -0
  84. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/gitlab_api.egg-info/top_level.txt +0 -0
  85. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/requirements.txt +0 -0
  86. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/security_sanitizer.py +0 -0
  87. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/validate_a2a_agent.py +0 -0
  88. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/validate_agent.py +0 -0
  89. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/scripts/verify_api_integration.py +0 -0
  90. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/setup.cfg +0 -0
  91. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/__init__.py +0 -0
  92. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/conftest.py +0 -0
  93. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_action_discovery.py +0 -0
  94. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_api_wrapper.py +0 -0
  95. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_auth.py +0 -0
  96. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_concept_parity.py +0 -0
  97. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_a2a_validation.py +0 -0
  98. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_api_brute_force_coverage.py +0 -0
  99. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_gql.py +0 -0
  100. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_mcp_validation.py +0 -0
  101. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_gitlab_models.py +0 -0
  102. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_init_dynamics.py +0 -0
  103. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_instances.py +0 -0
  104. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_mock_coverage.py +0 -0
  105. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_startup.py +0 -0
  106. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_tool_modes.py +0 -0
  107. {gitlab_api-26.1.1 → gitlab_api-26.4.0}/tests/test_verify_agent.py +0 -0
  108. {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.1.1
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.1.1; extra == "all"
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/gitlab-api)
53
53
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/gitlab-api)
54
54
 
55
- *Version: 26.1.1*
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>192 per-operation tools — one per public API method (click to expand)</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
- _32 action-routed tool(s) (default) · 192 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._
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
- _44 package + 14 inherited variable(s). Auto-generated from `.env.example` + the shared agent-utilities set — do not edit._
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/gitlab-api)
21
21
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/gitlab-api)
22
22
 
23
- *Version: 26.1.1*
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>192 per-operation tools — one per public API method (click to expand)</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
- _32 action-routed tool(s) (default) · 192 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._
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
- _44 package + 14 inherited variable(s). Auto-generated from `.env.example` + the shared agent-utilities set — do not edit._
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
 
@@ -4,7 +4,7 @@ import os
4
4
  import sys
5
5
  import warnings
6
6
 
7
- __version__ = "26.1.1"
7
+ __version__ = "26.4.0"
8
8
 
9
9
  logging.basicConfig(
10
10
  level=logging.INFO,
@@ -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"