gitlab-api 27.3.8__tar.gz → 27.3.10__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 (96) hide show
  1. {gitlab_api-27.3.8/gitlab_api.egg-info → gitlab_api-27.3.10}/PKG-INFO +3 -3
  2. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/README.md +1 -1
  3. gitlab_api-27.3.10/gitlab_api/connector_sources.py +261 -0
  4. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/mcp_server.py +1 -1
  5. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/ontology/certification.json +0 -3
  6. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/ontology/gitlab.ttl +3 -6
  7. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/prompts/devops_specialist.json +0 -2
  8. {gitlab_api-27.3.8 → gitlab_api-27.3.10/gitlab_api.egg-info}/PKG-INFO +3 -3
  9. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api.egg-info/SOURCES.txt +1 -4
  10. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api.egg-info/requires.txt +1 -1
  11. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/pyproject.toml +3 -3
  12. gitlab_api-27.3.10/requirements.txt +1 -0
  13. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_cq_paths.py +5 -7
  14. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_fleet_name.py +2 -10
  15. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_ingest_sources.py +5 -18
  16. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_kg_ingest.py +9 -9
  17. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_ontology_parent_link.py +0 -2
  18. gitlab_api-27.3.8/gitlab_api/connector_manifest.yml +0 -302
  19. gitlab_api-27.3.8/gitlab_api/connectors/mcp_source_presets.json +0 -18
  20. gitlab_api-27.3.8/gitlab_api/connectors/tool_schema_fingerprints.json +0 -8
  21. gitlab_api-27.3.8/gitlab_api/ontology/ingest_sources.json +0 -38
  22. gitlab_api-27.3.8/requirements.txt +0 -1
  23. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/LICENSE +0 -0
  24. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/MANIFEST.in +0 -0
  25. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/__init__.py +0 -0
  26. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/__main__.py +0 -0
  27. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/__init__.py +0 -0
  28. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_base.py +0 -0
  29. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_environments.py +0 -0
  30. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_issues.py +0 -0
  31. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_merge_requests.py +0 -0
  32. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_other.py +0 -0
  33. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_pipelines.py +0 -0
  34. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_projects.py +0 -0
  35. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_repositories.py +0 -0
  36. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_system.py +0 -0
  37. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_users_groups.py +0 -0
  38. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api/api_client_vulnerabilities.py +0 -0
  39. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/api_client.py +0 -0
  40. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/auth.py +0 -0
  41. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/connector_prep.py +0 -0
  42. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/connectors/__init__.py +0 -0
  43. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/gitlab_gql.py +0 -0
  44. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/gitlab_input_models.py +0 -0
  45. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/gitlab_response_models.py +0 -0
  46. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/instances.py +0 -0
  47. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/kg_ingest.py +0 -0
  48. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/mcp_config.json +0 -0
  49. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/ontology/__init__.py +0 -0
  50. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/ontology/fixtures/records.json +0 -0
  51. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/ontology/mappings/source.yaml +0 -0
  52. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/ontology/migrations/manifest.json +0 -0
  53. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/ontology/shapes/connector.shacl.ttl +0 -0
  54. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/prompts/__init__.py +0 -0
  55. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/__init__.py +0 -0
  56. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-api-operations/SKILL.md +0 -0
  57. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-api-operations/agents/openai.yaml +0 -0
  58. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-api-operations/references/catalog.md +0 -0
  59. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-issues/SKILL.md +0 -0
  60. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-issues/WORKFLOW.md +0 -0
  61. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-merge-request-create/SKILL.md +0 -0
  62. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-merge-request-create/WORKFLOW.md +0 -0
  63. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-merge-request-review/SKILL.md +0 -0
  64. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-merge-request-review/WORKFLOW.md +0 -0
  65. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-pipelines/SKILL.md +0 -0
  66. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-pipelines/WORKFLOW.md +0 -0
  67. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-vulnerabilities/SKILL.md +0 -0
  68. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api/skills/gitlab-vulnerabilities/WORKFLOW.md +0 -0
  69. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api.egg-info/dependency_links.txt +0 -0
  70. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api.egg-info/entry_points.txt +0 -0
  71. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/gitlab_api.egg-info/top_level.txt +0 -0
  72. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/scripts/check_import_safety.py +0 -0
  73. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/scripts/security_contract.py +0 -0
  74. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/scripts/security_sanitizer.py +0 -0
  75. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/scripts/verify_api_integration.py +0 -0
  76. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/setup.cfg +0 -0
  77. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/__init__.py +0 -0
  78. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/conftest.py +0 -0
  79. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_api_wrapper.py +0 -0
  80. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_auth.py +0 -0
  81. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_connector_prep.py +0 -0
  82. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_default_content_surfaces.py +0 -0
  83. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_gitlab_a2a_validation.py +0 -0
  84. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_gitlab_api_brute_force_coverage.py +0 -0
  85. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_gitlab_gql.py +0 -0
  86. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_gitlab_mcp_validation.py +0 -0
  87. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_gitlab_models.py +0 -0
  88. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_identity_context_scoping.py +0 -0
  89. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_init_dynamics.py +0 -0
  90. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_instances.py +0 -0
  91. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_mock_coverage.py +0 -0
  92. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_security_sanitizer.py +0 -0
  93. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_startup.py +0 -0
  94. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_tool_modes.py +0 -0
  95. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/test_verify_agent.py +0 -0
  96. {gitlab_api-27.3.8 → gitlab_api-27.3.10}/tests/verify_a2a_queries.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitlab-api
3
- Version: 27.3.8
3
+ Version: 27.3.10
4
4
  Summary: GitLab API + MCP Server
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License: MIT
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3
12
12
  Requires-Python: >=3.12
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
- Requires-Dist: agent-connector-sdk[graphql,mcp]<1.0.0,>=0.3.18
15
+ Requires-Dist: agent-connector-sdk[graphql,mcp]<1.0.0,>=0.4.1
16
16
  Requires-Dist: python-dotenv>=1.2.4
17
17
  Provides-Extra: mcp
18
18
  Provides-Extra: all
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/gitlab-api)
46
46
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/gitlab-api)
47
47
 
48
- *Version: 27.3.8*
48
+ *Version: 27.3.10*
49
49
 
50
50
  > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
51
51
  > backing GitLab instance are maintained in the
@@ -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: 27.3.8*
23
+ *Version: 27.3.10*
24
24
 
25
25
  > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
26
26
  > backing GitLab instance are maintained in the
@@ -0,0 +1,261 @@
1
+ """Data sources of this connector, declared by tool name (generated by connector-ontology-map migrate).
2
+
3
+ Served live as ``connector://resources``. Regenerate by editing the declarations, not the tools.
4
+ """
5
+
6
+ # ruff: noqa: E501
7
+ from __future__ import annotations
8
+
9
+ from agent_connector_sdk.ingest.live_declaration import source_meta
10
+ from agent_connector_sdk.ingest.sources import IngestSourceDeclaration, IngestSourceSpec
11
+
12
+ CONNECTOR = "gitlab-mcp"
13
+
14
+ SOURCES = (
15
+ source_meta(
16
+ tool="gitlab_get_issues",
17
+ source_id="issues",
18
+ record_type="Issue",
19
+ id_field="id",
20
+ arguments={
21
+ "max_pages": 1,
22
+ "per_page": 50,
23
+ "state": "opened",
24
+ },
25
+ cursor_field="updated_at",
26
+ description="Open GitLab issues visible to the configured token (first 50).",
27
+ records_path="data",
28
+ text_field="description",
29
+ title_field="title",
30
+ ),
31
+ source_meta(
32
+ tool="gitlab_get_projects",
33
+ source_id="projects",
34
+ record_type="Project",
35
+ id_field="id",
36
+ cursor_field="last_activity_at",
37
+ description="GitLab projects visible to the configured token.",
38
+ incremental=True,
39
+ page_param="page",
40
+ page_size_param="per_page",
41
+ pagination="page",
42
+ preset={
43
+ "doc_type": "repository",
44
+ "page_kind": "number",
45
+ "params_style": "args",
46
+ },
47
+ records_path="data",
48
+ server="gitlab-mcp",
49
+ text_field="description",
50
+ title_field="path_with_namespace",
51
+ ),
52
+ )
53
+
54
+ SCHEMA_MAPPINGS = {
55
+ "CheckRun": {
56
+ "fields": {
57
+ "createdAt": "xsd:dateTime",
58
+ "duration": "xsd:decimal",
59
+ "failureReason": "xsd:string",
60
+ "finishedAt": "xsd:dateTime",
61
+ "iid": "xsd:string",
62
+ "logUrl": "xsd:string",
63
+ "pipelineStatus": "xsd:string",
64
+ "ref": "xsd:string",
65
+ "sha": "xsd:string",
66
+ "startedAt": "xsd:dateTime",
67
+ "state": "xsd:string",
68
+ "triggerSource": "xsd:string",
69
+ "webUrl": "xsd:string",
70
+ },
71
+ "ontology_class": "PipelineRun",
72
+ },
73
+ "Epic": {
74
+ "fields": {
75
+ "createdAt": "xsd:dateTime",
76
+ "duration": "xsd:decimal",
77
+ "failureReason": "xsd:string",
78
+ "finishedAt": "xsd:dateTime",
79
+ "iid": "xsd:string",
80
+ "logUrl": "xsd:string",
81
+ "pipelineStatus": "xsd:string",
82
+ "ref": "xsd:string",
83
+ "sha": "xsd:string",
84
+ "startedAt": "xsd:dateTime",
85
+ "state": "xsd:string",
86
+ "triggerSource": "xsd:string",
87
+ "webUrl": "xsd:string",
88
+ },
89
+ "ontology_class": "WorkItem",
90
+ },
91
+ "GitLabGroup": {
92
+ "fields": {
93
+ "createdAt": "xsd:dateTime",
94
+ "duration": "xsd:decimal",
95
+ "failureReason": "xsd:string",
96
+ "finishedAt": "xsd:dateTime",
97
+ "iid": "xsd:string",
98
+ "logUrl": "xsd:string",
99
+ "pipelineStatus": "xsd:string",
100
+ "ref": "xsd:string",
101
+ "sha": "xsd:string",
102
+ "startedAt": "xsd:dateTime",
103
+ "state": "xsd:string",
104
+ "triggerSource": "xsd:string",
105
+ "webUrl": "xsd:string",
106
+ },
107
+ "ontology_class": "IdentityGroup",
108
+ },
109
+ "Issue": {
110
+ "fields": {
111
+ "createdAt": "xsd:dateTime",
112
+ "duration": "xsd:decimal",
113
+ "failureReason": "xsd:string",
114
+ "finishedAt": "xsd:dateTime",
115
+ "iid": "xsd:string",
116
+ "logUrl": "xsd:string",
117
+ "pipelineStatus": "xsd:string",
118
+ "ref": "xsd:string",
119
+ "sha": "xsd:string",
120
+ "startedAt": "xsd:dateTime",
121
+ "state": "xsd:string",
122
+ "triggerSource": "xsd:string",
123
+ "webUrl": "xsd:string",
124
+ },
125
+ "ontology_class": "WorkItem",
126
+ },
127
+ "Job": {
128
+ "fields": {
129
+ "createdAt": "xsd:dateTime",
130
+ "duration": "xsd:decimal",
131
+ "failureReason": "xsd:string",
132
+ "finishedAt": "xsd:dateTime",
133
+ "iid": "xsd:string",
134
+ "logUrl": "xsd:string",
135
+ "pipelineStatus": "xsd:string",
136
+ "ref": "xsd:string",
137
+ "sha": "xsd:string",
138
+ "startedAt": "xsd:dateTime",
139
+ "state": "xsd:string",
140
+ "triggerSource": "xsd:string",
141
+ "webUrl": "xsd:string",
142
+ },
143
+ "ontology_class": "Action",
144
+ },
145
+ "MergeRequest": {
146
+ "fields": {
147
+ "createdAt": "xsd:dateTime",
148
+ "duration": "xsd:decimal",
149
+ "failureReason": "xsd:string",
150
+ "finishedAt": "xsd:dateTime",
151
+ "iid": "xsd:string",
152
+ "logUrl": "xsd:string",
153
+ "pipelineStatus": "xsd:string",
154
+ "ref": "xsd:string",
155
+ "sha": "xsd:string",
156
+ "startedAt": "xsd:dateTime",
157
+ "state": "xsd:string",
158
+ "triggerSource": "xsd:string",
159
+ "webUrl": "xsd:string",
160
+ },
161
+ "ontology_class": "PullRequest",
162
+ },
163
+ "Pipeline": {
164
+ "fields": {
165
+ "createdAt": "xsd:dateTime",
166
+ "duration": "xsd:decimal",
167
+ "failureReason": "xsd:string",
168
+ "finishedAt": "xsd:dateTime",
169
+ "iid": "xsd:string",
170
+ "logUrl": "xsd:string",
171
+ "pipelineStatus": "xsd:string",
172
+ "ref": "xsd:string",
173
+ "sha": "xsd:string",
174
+ "startedAt": "xsd:dateTime",
175
+ "state": "xsd:string",
176
+ "triggerSource": "xsd:string",
177
+ "webUrl": "xsd:string",
178
+ },
179
+ "ontology_class": "PipelineRun",
180
+ },
181
+ "Project": {
182
+ "fields": {
183
+ "createdAt": "xsd:dateTime",
184
+ "duration": "xsd:decimal",
185
+ "failureReason": "xsd:string",
186
+ "finishedAt": "xsd:dateTime",
187
+ "iid": "xsd:string",
188
+ "logUrl": "xsd:string",
189
+ "pipelineStatus": "xsd:string",
190
+ "ref": "xsd:string",
191
+ "sha": "xsd:string",
192
+ "startedAt": "xsd:dateTime",
193
+ "state": "xsd:string",
194
+ "triggerSource": "xsd:string",
195
+ "webUrl": "xsd:string",
196
+ },
197
+ "ontology_class": "SoftwareProject",
198
+ },
199
+ }
200
+
201
+ RESOURCES = (
202
+ {
203
+ "id_prefix": "checkrun",
204
+ "label": "Check Run",
205
+ "name": "CheckRun",
206
+ },
207
+ {
208
+ "id_prefix": "epic",
209
+ "label": "Epic",
210
+ "name": "Epic",
211
+ },
212
+ {
213
+ "id_prefix": "gitlabgroup",
214
+ "label": "GitLab Group",
215
+ "name": "GitLabGroup",
216
+ },
217
+ {
218
+ "id_prefix": "issue",
219
+ "label": "Issue",
220
+ "name": "Issue",
221
+ },
222
+ {
223
+ "id_prefix": "job",
224
+ "label": "Job",
225
+ "name": "Job",
226
+ },
227
+ {
228
+ "id_prefix": "mergerequest",
229
+ "label": "Merge Request",
230
+ "name": "MergeRequest",
231
+ },
232
+ {
233
+ "id_prefix": "pipeline",
234
+ "label": "Pipeline",
235
+ "name": "Pipeline",
236
+ },
237
+ {
238
+ "id_prefix": "project",
239
+ "label": "Project",
240
+ "name": "Project",
241
+ },
242
+ )
243
+
244
+
245
+ def declaration() -> IngestSourceDeclaration:
246
+ """The declaration the server assembles from this module."""
247
+ specs = []
248
+ for item in SOURCES:
249
+ for entry in item["connector_sources"]:
250
+ body = {k: v for k, v in entry.items() if k not in ("tool", "mapping")}
251
+ specs.append(
252
+ IngestSourceSpec.model_validate({**body, "tools": (entry["tool"],)})
253
+ )
254
+ return IngestSourceDeclaration.model_validate(
255
+ {
256
+ "connector": CONNECTOR,
257
+ "sources": specs,
258
+ "schema_mappings": SCHEMA_MAPPINGS,
259
+ "resources": RESOURCES,
260
+ }
261
+ )
@@ -35,7 +35,7 @@ from agent_connector_sdk.mcp.tool_surface import register_tool_surface
35
35
  from gitlab_api.api_client import Api
36
36
  from gitlab_api.auth import get_client
37
37
 
38
- __version__ = "27.3.8"
38
+ __version__ = "27.3.10"
39
39
  print(f"Gitlab MCP v{__version__}", file=sys.stderr)
40
40
 
41
41
  logger = get_logger(name="mcp_server")
@@ -1,9 +1,6 @@
1
1
  {
2
2
  "api_version": "arbora.io/v1",
3
3
  "artifacts": {
4
- "connector_manifest.yml": "ce8e95019a673f0268315c5ec472e7dc7ff3d924f5d3594a90f0f4e10a9ee11a",
5
- "gitlab_api/connectors/mcp_source_presets.json": "08401d486ad760f128203a710577be5be0a7c892acd6f46685077d19294b641e",
6
- "gitlab_api/connectors/tool_schema_fingerprints.json": "0cf8e4ef949fc58d36f74b949ae9e8f5ec25dc607dfb186da1eb1efc3728edc1",
7
4
  "gitlab_api/ontology/fixtures/records.json": "5f0417820053941933f15b3f459750753f4e8e34cf1e7853fd030c1143356b40",
8
5
  "gitlab_api/ontology/gitlab.ttl": "19fa64000d2e51c60c53074b1fae4ab98aed85318337b5a2199f4837ae9f3fc0",
9
6
  "gitlab_api/ontology/mappings/source.yaml": "167206b5387f7ca97ce02e0f15164f8fe41f06b413b591d0008c29e9f0a95e7f",
@@ -24,10 +24,8 @@
24
24
  rdfs:label "Project" ;
25
25
  rdfs:comment "A GitLab project / repository (gitlab_projects)." .
26
26
 
27
- :MergeRequest a owl:Class ;
28
- rdfs:subClassOf :PullRequest ;
29
- rdfs:label "Merge Request" ;
30
- rdfs:comment "A proposed change under review, from a source to a target branch (gitlab_merge_requests)." .
27
+ :MergeRequest a owl:Class .
28
+
31
29
 
32
30
  :Pipeline a owl:Class ;
33
31
  rdfs:subClassOf :PipelineRun ;
@@ -189,5 +187,4 @@
189
187
  rdfs:comment """GitLab source-control and CI/CD delivery model — groups, projects,
190
188
  merge requests, pipelines, jobs, issues, epics, milestones, commits, branches,
191
189
  releases and runners, with their review and delivery relationships — federated into
192
- the agent-connector-sdk knowledge-graph hub.""" ;
193
- owl:imports <http://knuckles.team/kg> .
190
+ the agent-connector-sdk knowledge-graph hub.""" .
@@ -4,8 +4,6 @@
4
4
  "schema_version": "1.0",
5
5
  "prompt_version": "0.1.0",
6
6
  "source": "gitlab-api",
7
- "extends": "agent-connector-sdk:base",
8
- "compose": "append",
9
7
  "description": "GitLab DevOps specialist: code review, CI/CD delivery, and issue tracking over the gitlab-api MCP server.",
10
8
  "metadata": {
11
9
  "topic": "GitLab DevOps",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gitlab-api
3
- Version: 27.3.8
3
+ Version: 27.3.10
4
4
  Summary: GitLab API + MCP Server
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License: MIT
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3
12
12
  Requires-Python: >=3.12
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
- Requires-Dist: agent-connector-sdk[graphql,mcp]<1.0.0,>=0.3.18
15
+ Requires-Dist: agent-connector-sdk[graphql,mcp]<1.0.0,>=0.4.1
16
16
  Requires-Dist: python-dotenv>=1.2.4
17
17
  Provides-Extra: mcp
18
18
  Provides-Extra: all
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/gitlab-api)
46
46
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/gitlab-api)
47
47
 
48
- *Version: 27.3.8*
48
+ *Version: 27.3.10*
49
49
 
50
50
  > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
51
51
  > backing GitLab instance are maintained in the
@@ -7,8 +7,8 @@ gitlab_api/__init__.py
7
7
  gitlab_api/__main__.py
8
8
  gitlab_api/api_client.py
9
9
  gitlab_api/auth.py
10
- gitlab_api/connector_manifest.yml
11
10
  gitlab_api/connector_prep.py
11
+ gitlab_api/connector_sources.py
12
12
  gitlab_api/gitlab_gql.py
13
13
  gitlab_api/gitlab_input_models.py
14
14
  gitlab_api/gitlab_response_models.py
@@ -35,12 +35,9 @@ gitlab_api/api/api_client_system.py
35
35
  gitlab_api/api/api_client_users_groups.py
36
36
  gitlab_api/api/api_client_vulnerabilities.py
37
37
  gitlab_api/connectors/__init__.py
38
- gitlab_api/connectors/mcp_source_presets.json
39
- gitlab_api/connectors/tool_schema_fingerprints.json
40
38
  gitlab_api/ontology/__init__.py
41
39
  gitlab_api/ontology/certification.json
42
40
  gitlab_api/ontology/gitlab.ttl
43
- gitlab_api/ontology/ingest_sources.json
44
41
  gitlab_api/ontology/fixtures/records.json
45
42
  gitlab_api/ontology/mappings/source.yaml
46
43
  gitlab_api/ontology/migrations/manifest.json
@@ -1,4 +1,4 @@
1
- agent-connector-sdk[graphql,mcp]<1.0.0,>=0.3.18
1
+ agent-connector-sdk[graphql,mcp]<1.0.0,>=0.4.1
2
2
  python-dotenv>=1.2.4
3
3
 
4
4
  [all]
@@ -4,12 +4,12 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "gitlab-api"
7
- version = "27.3.8"
7
+ version = "27.3.10"
8
8
  description = "GitLab API + MCP Server"
9
9
  readme = "README.md"
10
10
  classifiers = [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
11
11
  requires-python = ">=3.12"
12
- dependencies = [ "agent-connector-sdk[mcp,graphql]>=0.3.18,<1.0.0", "python-dotenv>=1.2.4",]
12
+ dependencies = [ "agent-connector-sdk[mcp,graphql]>=0.4.1,<1.0.0", "python-dotenv>=1.2.4",]
13
13
  [[project.authors]]
14
14
  name = "Project Maintainers"
15
15
  email = "maintainers@users.noreply.github.com"
@@ -69,7 +69,7 @@ dev = [
69
69
  ]
70
70
 
71
71
  [tool.setuptools.package-data]
72
- gitlab_api = [ "mcp_config.json", "connector_manifest.yml", "agent_data/**", "prompts/**", "skills/**", "ontology/**", "connectors/**",]
72
+ gitlab_api = [ "mcp_config.json", "agent_data/**", "prompts/**", "skills/**", "ontology/**", "connectors/**",]
73
73
 
74
74
  [tool.ruff.lint]
75
75
  select = [ "E", "F", "I", "UP", "B",]
@@ -0,0 +1 @@
1
+ agent-connector-sdk[mcp]>=0.4.1,<1.0.0
@@ -2,11 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from gitlab_api.connector_sources import declaration as declared_sources
5
6
  import re
6
7
  from pathlib import Path
7
8
 
8
9
  import pytest
9
- import yaml
10
10
 
11
11
  import gitlab_api
12
12
 
@@ -35,17 +35,15 @@ def test_state_is_declared_on_the_issue_type() -> None:
35
35
 
36
36
 
37
37
  def test_merge_request_and_check_run_extend_shared_classes() -> None:
38
- assert "rdfs:subClassOf :PullRequest" in _block("MergeRequest")
38
+ # The EG ontology owns MergeRequest's parent (a sibling of PullRequest); the pack gives it none.
39
+ assert "rdfs:subClassOf" not in _block("MergeRequest")
39
40
  assert "rdfs:subClassOf :PipelineRun" in _block("CheckRun")
40
41
 
41
42
 
42
43
  def test_no_mapping_has_a_null_ontology_class() -> None:
43
- manifest = yaml.safe_load(
44
- (PACKAGE.parent / "connector_manifest.yml").read_text("utf-8")
45
- )
46
44
  unmapped = [
47
45
  name
48
- for name, mapping in manifest["schema_mappings"].items()
49
- if not mapping["ontology_class"]
46
+ for name, mapping in declared_sources().schema_mappings.items()
47
+ if not mapping.ontology_class
50
48
  ]
51
49
  assert unmapped == []
@@ -2,9 +2,8 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from agent_connector_sdk.connector_identity import connector_name
5
6
  import ast
6
- import json
7
- import re
8
7
  import tomllib
9
8
  from pathlib import Path
10
9
 
@@ -38,13 +37,6 @@ def test_connector_name_is_the_fleet_name() -> None:
38
37
  assert pyproject["project"]["entry-points"]["agent_connector_sdk.connector"] == {
39
38
  FLEET: "gitlab_api"
40
39
  }
41
- manifest = (PACKAGE / "connector_manifest.yml").read_text(encoding="utf-8")
42
- match = re.search(r'^\s*"?connector"?\s*:\s*"?([^"\s,]+)', manifest, re.MULTILINE)
43
- assert match is not None and match.group(1) == FLEET
44
- fingerprints = PACKAGE / "connectors" / "tool_schema_fingerprints.json"
45
- if fingerprints.is_file():
46
- assert (
47
- json.loads(fingerprints.read_text(encoding="utf-8"))["connector"] == FLEET
48
- )
40
+ assert connector_name("gitlab_api") == FLEET
49
41
  for module in sorted(PACKAGE.glob("*.py")):
50
42
  assert all(name == FLEET for name in _call_connectors(module)), module.name
@@ -2,21 +2,18 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from pathlib import Path
6
5
 
7
6
  import pytest
8
- import yaml
9
- from agent_connector_sdk.ingest.sources import load_ingest_sources
7
+ from gitlab_api.connector_sources import declaration as declared_sources
10
8
  from agent_connector_sdk.mcp.method_tools import operation_annotations, operation_verb
11
9
  from agent_connector_sdk.mcp.tool_surface import operation_prefix
12
10
 
13
- import gitlab_api
14
11
  from gitlab_api.api_client import Api
15
12
 
16
13
 
17
14
  @pytest.mark.spec("CONN-GITLAB-API-R001")
18
15
  def test_declares_ingestible_sources() -> None:
19
- declaration = load_ingest_sources(Path(gitlab_api.__file__).parent)
16
+ declaration = declared_sources()
20
17
  assert declaration is not None
21
18
  assert declaration.connector == "gitlab-mcp"
22
19
  source = declaration.source("projects")
@@ -24,12 +21,7 @@ def test_declares_ingestible_sources() -> None:
24
21
  prefix = operation_prefix("gitlab-api")
25
22
  assert source.tools == (f"{prefix}_get_projects",)
26
23
  # The engine admits a record only under the pack mapping of its type.
27
- manifest = yaml.safe_load(
28
- (Path(gitlab_api.__file__).parent / "connector_manifest.yml").read_text(
29
- "utf-8"
30
- )
31
- )
32
- assert source.record_type in manifest["schema_mappings"]
24
+ assert source.record_type in declared_sources().schema_mappings
33
25
  method = getattr(Api, "get_projects")
34
26
  annotations = operation_annotations("get_projects", operation_verb(method))
35
27
  assert annotations.read_only_hint is True
@@ -37,19 +29,14 @@ def test_declares_ingestible_sources() -> None:
37
29
 
38
30
  @pytest.mark.spec("CONN-GITLAB-API-R001")
39
31
  def test_declares_issues_source() -> None:
40
- declaration = load_ingest_sources(Path(gitlab_api.__file__).parent)
32
+ declaration = declared_sources()
41
33
  assert declaration is not None
42
34
  assert declaration.connector == "gitlab-mcp"
43
35
  source = declaration.source("issues")
44
36
  assert source is not None and source.record_type == "Issue"
45
37
  prefix = operation_prefix("gitlab-api")
46
38
  assert source.tools == (f"{prefix}_get_issues",)
47
- manifest = yaml.safe_load(
48
- (Path(gitlab_api.__file__).parent / "connector_manifest.yml").read_text(
49
- "utf-8"
50
- )
51
- )
52
- assert source.record_type in manifest["schema_mappings"]
39
+ assert source.record_type in declared_sources().schema_mappings
53
40
  method = getattr(Api, "get_issues")
54
41
  annotations = operation_annotations("get_issues", operation_verb(method))
55
42
  assert annotations.read_only_hint is True
@@ -63,9 +63,9 @@ async def test_ingest_entities_writes_nodes_and_edges(ingest):
63
63
  assert record_ids == {"a", "b"}
64
64
  a_record = next(r for r in request.records if r.record_id == "a")
65
65
  assert a_record.payload["name"] == "p"
66
- assert a_record.mapping_reference.endswith("schema_mappings/Project")
66
+ assert a_record.mapping_reference.endswith("mappings/Project")
67
67
  assert request.relationships[0].relation_reference.endswith(
68
- "resources/Project/relations/partOfGroup"
68
+ "relations/Project/partOfGroup"
69
69
  )
70
70
 
71
71
 
@@ -87,13 +87,13 @@ async def test_ingest_projects_maps_project_and_group(ingest):
87
87
  assert res == {"nodes": 2, "edges": 1}
88
88
  request = transport.requests[0]
89
89
  project = next(r for r in request.records if r.record_id == "gitlab:project:42")
90
- assert project.mapping_reference.endswith("schema_mappings/Project")
90
+ assert project.mapping_reference.endswith("mappings/Project")
91
91
  assert project.payload["path_with_namespace"] == "grp/demo"
92
92
  assert project.payload["externalToolId"] == "42"
93
93
  group = next(r for r in request.records if r.record_id == "gitlab:group:7")
94
- assert group.mapping_reference.endswith("schema_mappings/GitLabGroup")
94
+ assert group.mapping_reference.endswith("mappings/GitLabGroup")
95
95
  assert request.relationships[0].relation_reference.endswith(
96
- "resources/Project/relations/partOfGroup"
96
+ "relations/Project/partOfGroup"
97
97
  )
98
98
 
99
99
 
@@ -152,7 +152,7 @@ async def test_ingest_pipeline_runs_maps_pipeline_job_commit_and_runner(ingest):
152
152
  r for r in request.records if r.record_id == "gitlab:pipelinerun:42:101"
153
153
  )
154
154
  # Same class name github-agent uses, so both CI systems unify.
155
- assert pipe_record.mapping_reference.endswith("schema_mappings/PipelineRun")
155
+ assert pipe_record.mapping_reference.endswith("mappings/PipelineRun")
156
156
  assert pipe_record.payload["status"] == "failed"
157
157
  assert pipe_record.payload["sha"] == "abc123"
158
158
  assert pipe_record.payload["triggerSource"] == "push"
@@ -161,7 +161,7 @@ async def test_ingest_pipeline_runs_maps_pipeline_job_commit_and_runner(ingest):
161
161
  job_record = next(
162
162
  r for r in request.records if r.record_id == "gitlab:checkrun:42:101:501"
163
163
  )
164
- assert job_record.mapping_reference.endswith("schema_mappings/CheckRun")
164
+ assert job_record.mapping_reference.endswith("mappings/CheckRun")
165
165
  assert job_record.payload["failureReason"] == "script_failure"
166
166
  assert job_record.payload["logUrl"] == "https://gl/grp/demo/-/jobs/501/raw"
167
167
  assert job_record.payload["externalToolId"] == "501"
@@ -169,10 +169,10 @@ async def test_ingest_pipeline_runs_maps_pipeline_job_commit_and_runner(ingest):
169
169
  commit_record = next(
170
170
  r for r in request.records if r.record_id == "gitlab:commit:42:abc123"
171
171
  )
172
- assert commit_record.mapping_reference.endswith("schema_mappings/Commit")
172
+ assert commit_record.mapping_reference.endswith("mappings/Commit")
173
173
 
174
174
  runner_record = next(r for r in request.records if r.record_id == "gitlab:runner:9")
175
- assert runner_record.mapping_reference.endswith("schema_mappings/Runner")
175
+ assert runner_record.mapping_reference.endswith("mappings/Runner")
176
176
  assert runner_record.payload["name"] == "shared-runner"
177
177
 
178
178
  # ranFor / hasJob edge names match github-agent's twin producer.
@@ -105,6 +105,4 @@ def test_ontology_joins_the_parent_graph(path: Path) -> None:
105
105
  declared = {s for s, p, o in triples if p == RDF_TYPE and o == OWL + "Class"}
106
106
  if not declared:
107
107
  pytest.skip("declares no classes")
108
- imports = {o for s, p, o in triples if p == OWL + "imports"}
109
- assert any(i == PARENT_IRI or i.startswith(PARENT_IRI + "/") for i in imports)
110
108
  assert _orphans(triples) == PENDING_NEW_PARENT & declared