gitlab-api 26.4.0__tar.gz → 27.3.2__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 (145) hide show
  1. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/LICENSE +1 -1
  2. gitlab_api-26.4.0/README.md → gitlab_api-27.3.2/PKG-INFO +97 -290
  3. gitlab_api-26.4.0/PKG-INFO → gitlab_api-27.3.2/README.md +67 -322
  4. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/__init__.py +32 -21
  5. gitlab_api-27.3.2/gitlab_api/__main__.py +4 -0
  6. gitlab_api-27.3.2/gitlab_api/api/api_client_base.py +242 -0
  7. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_environments.py +6 -42
  8. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_issues.py +3 -33
  9. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_merge_requests.py +3 -17
  10. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_other.py +3 -35
  11. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_pipelines.py +3 -41
  12. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_projects.py +35 -70
  13. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_repositories.py +3 -59
  14. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_system.py +4 -6
  15. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_users_groups.py +11 -31
  16. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/api_client_vulnerabilities.py +11 -9
  17. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api_client.py +2 -3
  18. gitlab_api-27.3.2/gitlab_api/auth.py +233 -0
  19. gitlab_api-27.3.2/gitlab_api/connector_manifest.yml +439 -0
  20. gitlab_api-27.3.2/gitlab_api/connector_prep.py +1720 -0
  21. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/connectors/mcp_source_presets.json +5 -5
  22. gitlab_api-27.3.2/gitlab_api/connectors/tool_schema_fingerprints.json +8 -0
  23. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/gitlab_gql.py +100 -44
  24. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/gitlab_input_models.py +165 -257
  25. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/gitlab_response_models.py +2 -5
  26. gitlab_api-27.3.2/gitlab_api/instances.py +156 -0
  27. gitlab_api-27.3.2/gitlab_api/kg_ingest.py +295 -0
  28. gitlab_api-27.3.2/gitlab_api/mcp_server.py +1382 -0
  29. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/ontology/__init__.py +2 -2
  30. gitlab_api-27.3.2/gitlab_api/ontology/certification.json +36 -0
  31. gitlab_api-27.3.2/gitlab_api/ontology/fixtures/records.json +21 -0
  32. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/ontology/gitlab.ttl +1 -1
  33. gitlab_api-27.3.2/gitlab_api/ontology/ingest_sources.json +19 -0
  34. gitlab_api-27.3.2/gitlab_api/ontology/mappings/source.yaml +20 -0
  35. gitlab_api-27.3.2/gitlab_api/ontology/migrations/manifest.json +6 -0
  36. gitlab_api-27.3.2/gitlab_api/ontology/shapes/connector.shacl.ttl +284 -0
  37. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/prompts/devops_specialist.json +1 -1
  38. gitlab_api-27.3.2/gitlab_api/skills/gitlab-api-operations/SKILL.md +33 -0
  39. gitlab_api-27.3.2/gitlab_api/skills/gitlab-api-operations/agents/openai.yaml +4 -0
  40. gitlab_api-27.3.2/gitlab_api/skills/gitlab-api-operations/references/catalog.md +9 -0
  41. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/skills/gitlab-issues/SKILL.md +3 -3
  42. gitlab_api-27.3.2/gitlab_api/skills/gitlab-issues/WORKFLOW.md +75 -0
  43. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/skills/gitlab-merge-request-create/SKILL.md +2 -2
  44. gitlab_api-27.3.2/gitlab_api/skills/gitlab-merge-request-create/WORKFLOW.md +66 -0
  45. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/skills/gitlab-merge-request-review/SKILL.md +6 -6
  46. gitlab_api-27.3.2/gitlab_api/skills/gitlab-merge-request-review/WORKFLOW.md +115 -0
  47. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/skills/gitlab-pipelines/SKILL.md +5 -5
  48. gitlab_api-27.3.2/gitlab_api/skills/gitlab-pipelines/WORKFLOW.md +89 -0
  49. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/skills/gitlab-vulnerabilities/SKILL.md +4 -4
  50. gitlab_api-27.3.2/gitlab_api/skills/gitlab-vulnerabilities/WORKFLOW.md +94 -0
  51. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api.egg-info/PKG-INFO +81 -306
  52. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api.egg-info/SOURCES.txt +23 -39
  53. gitlab_api-27.3.2/gitlab_api.egg-info/entry_points.txt +14 -0
  54. gitlab_api-27.3.2/gitlab_api.egg-info/requires.txt +18 -0
  55. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api.egg-info/top_level.txt +3 -0
  56. gitlab_api-27.3.2/pyproject.toml +82 -0
  57. gitlab_api-27.3.2/requirements.txt +1 -0
  58. gitlab_api-27.3.2/scripts/check_import_safety.py +302 -0
  59. gitlab_api-27.3.2/scripts/security_contract.py +748 -0
  60. gitlab_api-27.3.2/scripts/security_sanitizer.py +326 -0
  61. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/scripts/verify_api_integration.py +156 -112
  62. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_api_wrapper.py +2 -2
  63. gitlab_api-27.3.2/tests/test_auth.py +129 -0
  64. gitlab_api-27.3.2/tests/test_connector_prep.py +337 -0
  65. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_gitlab_a2a_validation.py +32 -26
  66. gitlab_api-27.3.2/tests/test_gitlab_api_brute_force_coverage.py +449 -0
  67. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_gitlab_gql.py +49 -31
  68. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_gitlab_mcp_validation.py +1 -1
  69. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_gitlab_models.py +510 -510
  70. gitlab_api-27.3.2/tests/test_identity_context_scoping.py +71 -0
  71. gitlab_api-27.3.2/tests/test_ingest_sources.py +35 -0
  72. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_instances.py +24 -11
  73. gitlab_api-27.3.2/tests/test_kg_ingest.py +202 -0
  74. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_mock_coverage.py +11 -80
  75. gitlab_api-27.3.2/tests/test_security_sanitizer.py +30 -0
  76. gitlab_api-27.3.2/tests/test_startup.py +0 -0
  77. gitlab_api-27.3.2/tests/test_tool_modes.py +24 -0
  78. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_verify_agent.py +1 -1
  79. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/verify_a2a_queries.py +21 -11
  80. gitlab_api-26.4.0/gitlab_api/__main__.py +0 -4
  81. gitlab_api-26.4.0/gitlab_api/agent_server.py +0 -83
  82. gitlab_api-26.4.0/gitlab_api/api/api_client_base.py +0 -214
  83. gitlab_api-26.4.0/gitlab_api/auth.py +0 -180
  84. gitlab_api-26.4.0/gitlab_api/instances.py +0 -110
  85. gitlab_api-26.4.0/gitlab_api/kg_ingest.py +0 -269
  86. gitlab_api-26.4.0/gitlab_api/main_agent.json +0 -18
  87. gitlab_api-26.4.0/gitlab_api/mcp/__init__.py +0 -71
  88. gitlab_api-26.4.0/gitlab_api/mcp/mcp_branches.py +0 -59
  89. gitlab_api-26.4.0/gitlab_api/mcp/mcp_commits.py +0 -93
  90. gitlab_api-26.4.0/gitlab_api/mcp/mcp_custom_api.py +0 -47
  91. gitlab_api-26.4.0/gitlab_api/mcp/mcp_deploy_tokens.py +0 -77
  92. gitlab_api-26.4.0/gitlab_api/mcp/mcp_environments.py +0 -89
  93. gitlab_api-26.4.0/gitlab_api/mcp/mcp_epics.py +0 -59
  94. gitlab_api-26.4.0/gitlab_api/mcp/mcp_graphql.py +0 -86
  95. gitlab_api-26.4.0/gitlab_api/mcp/mcp_graphql_ops.py +0 -93
  96. gitlab_api-26.4.0/gitlab_api/mcp/mcp_groups.py +0 -72
  97. gitlab_api-26.4.0/gitlab_api/mcp/mcp_issues.py +0 -63
  98. gitlab_api-26.4.0/gitlab_api/mcp/mcp_jobs.py +0 -76
  99. gitlab_api-26.4.0/gitlab_api/mcp/mcp_labels.py +0 -59
  100. gitlab_api-26.4.0/gitlab_api/mcp/mcp_members.py +0 -53
  101. gitlab_api-26.4.0/gitlab_api/mcp/mcp_merge_requests.py +0 -65
  102. gitlab_api-26.4.0/gitlab_api/mcp/mcp_merge_rules.py +0 -100
  103. gitlab_api-26.4.0/gitlab_api/mcp/mcp_milestones.py +0 -59
  104. gitlab_api-26.4.0/gitlab_api/mcp/mcp_misc.py +0 -10
  105. gitlab_api-26.4.0/gitlab_api/mcp/mcp_namespaces.py +0 -53
  106. gitlab_api-26.4.0/gitlab_api/mcp/mcp_notes.py +0 -59
  107. gitlab_api-26.4.0/gitlab_api/mcp/mcp_packages.py +0 -55
  108. gitlab_api-26.4.0/gitlab_api/mcp/mcp_pipeline_schedules.py +0 -88
  109. gitlab_api-26.4.0/gitlab_api/mcp/mcp_pipelines.py +0 -53
  110. gitlab_api-26.4.0/gitlab_api/mcp/mcp_projects.py +0 -90
  111. gitlab_api-26.4.0/gitlab_api/mcp/mcp_protected_branches.py +0 -63
  112. gitlab_api-26.4.0/gitlab_api/mcp/mcp_releases.py +0 -87
  113. gitlab_api-26.4.0/gitlab_api/mcp/mcp_runners.py +0 -100
  114. gitlab_api-26.4.0/gitlab_api/mcp/mcp_snippets.py +0 -59
  115. gitlab_api-26.4.0/gitlab_api/mcp/mcp_tags.py +0 -75
  116. gitlab_api-26.4.0/gitlab_api/mcp/mcp_users.py +0 -61
  117. gitlab_api-26.4.0/gitlab_api/mcp/mcp_vulnerabilities.py +0 -59
  118. gitlab_api-26.4.0/gitlab_api/mcp/mcp_wiki.py +0 -63
  119. gitlab_api-26.4.0/gitlab_api/mcp_server.py +0 -2016
  120. gitlab_api-26.4.0/gitlab_api/prompts/main_agent.json +0 -18
  121. gitlab_api-26.4.0/gitlab_api.egg-info/entry_points.txt +0 -15
  122. gitlab_api-26.4.0/gitlab_api.egg-info/requires.txt +0 -21
  123. gitlab_api-26.4.0/pyproject.toml +0 -72
  124. gitlab_api-26.4.0/requirements.txt +0 -1
  125. gitlab_api-26.4.0/scripts/security_sanitizer.py +0 -160
  126. gitlab_api-26.4.0/scripts/validate_a2a_agent.py +0 -139
  127. gitlab_api-26.4.0/scripts/validate_agent.py +0 -62
  128. gitlab_api-26.4.0/tests/test_action_discovery.py +0 -70
  129. gitlab_api-26.4.0/tests/test_auth.py +0 -105
  130. gitlab_api-26.4.0/tests/test_concept_parity.py +0 -87
  131. gitlab_api-26.4.0/tests/test_gitlab_api_brute_force_coverage.py +0 -411
  132. gitlab_api-26.4.0/tests/test_kg_ingest.py +0 -182
  133. gitlab_api-26.4.0/tests/test_startup.py +0 -12
  134. gitlab_api-26.4.0/tests/test_tool_modes.py +0 -42
  135. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/MANIFEST.in +0 -0
  136. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/api/__init__.py +0 -0
  137. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/connectors/__init__.py +0 -0
  138. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/mcp_config.json +0 -0
  139. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/prompts/__init__.py +0 -0
  140. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api/skills/__init__.py +0 -0
  141. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/gitlab_api.egg-info/dependency_links.txt +0 -0
  142. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/setup.cfg +0 -0
  143. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/__init__.py +0 -0
  144. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/conftest.py +0 -0
  145. {gitlab_api-26.4.0 → gitlab_api-27.3.2}/tests/test_init_dynamics.py +0 -0
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2023 Audel Rouhi
1
+ Copyright (c) 2012-2023 Project Maintainers
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -1,5 +1,35 @@
1
+ Metadata-Version: 2.4
2
+ Name: gitlab-api
3
+ Version: 27.3.2
4
+ Summary: GitLab API + MCP Server
5
+ Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
+ License: MIT
7
+ Classifier: Development Status :: 5 - Production/Stable
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Environment :: Console
10
+ Classifier: Operating System :: POSIX :: Linux
11
+ Classifier: Programming Language :: Python :: 3
12
+ Requires-Python: >=3.12
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.5
16
+ Requires-Dist: python-dotenv>=1.2.4
17
+ Requires-Dist: gql[requests]>=4.4.0
18
+ Provides-Extra: mcp
19
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.5; extra == "mcp"
20
+ Provides-Extra: gql
21
+ Requires-Dist: gql[requests]>=4.4.0; extra == "gql"
22
+ Provides-Extra: all
23
+ Requires-Dist: gitlab-api[gql,mcp]>=27.2.0; extra == "all"
24
+ Provides-Extra: test
25
+ Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
26
+ Requires-Dist: pytest>=9.1.1; extra == "test"
27
+ Requires-Dist: pytest-asyncio>=1.4.0; extra == "test"
28
+ Requires-Dist: pytest-cov>=7.1.0; extra == "test"
29
+ Dynamic: license-file
30
+
1
31
  # Gitlab Api
2
- ## CLI or API | MCP | Agent
32
+ ## CLI or API | MCP
3
33
 
4
34
  ![PyPI - Version](https://img.shields.io/pypi/v/gitlab-api)
5
35
  ![MCP Server](https://badge.mcpx.dev?type=server 'MCP Server')
@@ -20,10 +50,9 @@
20
50
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/gitlab-api)
21
51
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/gitlab-api)
22
52
 
23
- *Version: 26.4.0*
53
+ *Version: 27.3.2*
24
54
 
25
55
  > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
26
- > interfaces, the integrated A2A agent server, and guidance for provisioning the
27
56
  > backing GitLab instance are maintained in the
28
57
  > [official documentation](https://knuckles-team.github.io/gitlab-api/).
29
58
 
@@ -31,22 +60,21 @@
31
60
 
32
61
  ## Overview
33
62
 
34
- **Gitlab Api** is a production-grade Agent and Model Context Protocol (MCP) server designed to interface directly with GitLab API + MCP Server + A2A Server.
63
+ **Gitlab Api** is a production-grade Agent and Model Context Protocol (MCP) server designed to interface directly with GitLab API + MCP Server.
35
64
 
36
65
  ---
37
66
 
38
67
  ## Key Features
39
68
 
40
69
  - **Consolidated Action-Routed MCP Tools:** Minimizes token overhead and eliminates tool bloat in LLM contexts by grouping methods into optimized, togglable tool modules.
41
- - **Enterprise-Grade Security:** Comprehensive support for Eunomia policies, OIDC token delegation, and granular execution context tracking.
42
- - **Integrated Graph Agent:** Built-in Pydantic AI agent supporting the Agent Control Protocol (ACP) and standard Web interfaces (AG-UI).
70
+ - **Enterprise-Grade Security:** Complete support for Eunomia policies, OIDC token delegation, and granular execution context tracking.
43
71
  - **Native Telemetry & Tracing:** Out-of-the-box OpenTelemetry exports and native Langfuse tracing.
44
72
 
45
73
  ---
46
74
 
47
75
  ## CLI or API
48
76
 
49
- This agent wraps the GitLab API + MCP Server + A2A Server API. You can interact with it programmatically or via its integrated execution entrypoints.
77
+ This agent wraps the GitLab API + MCP Server API. The operator can interact with it programmatically or via its integrated execution entrypoints.
50
78
 
51
79
  Detailed instructions on how to use the underlying API wrappers, extended schema bindings, and developer SDK references are maintained in [docs/index.md](docs/index.md).
52
80
 
@@ -54,15 +82,15 @@ Detailed instructions on how to use the underlying API wrappers, extended schema
54
82
 
55
83
  ## MCP
56
84
 
57
- This server utilizes dynamic Action-Routed tools to optimize token overhead and maximize IDE compatibility.
85
+ This server use dynamic Action-Routed tools to optimize token overhead and maximize IDE compatibility.
58
86
 
59
87
  ### Tool surface — `MCP_TOOL_MODE`
60
88
 
61
- Set `MCP_TOOL_MODE` (in the shared `~/.config/agent-utilities/config.json` or env):
89
+ Set `MCP_TOOL_MODE` (in the shared `~/.config/agent-connector-sdk/config.json` or env):
62
90
  `condensed` (default — the action-routed tools below), `verbose` (one named 1:1 tool
63
91
  per API method, e.g. `gitlab_get_branches(...)`, tagged `verbose`), or `both`. Filter
64
92
  the verbose set with `--tools tag:verbose` / `MCP_ENABLED_TAGS=verbose`. See the
65
- agent-utilities *MCP Tool Modes* guide.
93
+ agent-connector-sdk *MCP Tool Modes* guide.
66
94
 
67
95
  ### Available MCP Tools
68
96
 
@@ -318,13 +346,13 @@ _Auto-generated from the live MCP server — do not edit by hand._
318
346
  _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._
319
347
  <!-- MCP-TOOLS-TABLE:END -->
320
348
 
321
- Detailed tool schemas, parameter shapes, and validation constraints are preserved in [docs/mcp.md](docs/mcp.md).
349
+ Detailed tool schemas, parameter shapes, and validation constraints are preserved in [docs/usage.md](docs/usage.md).
322
350
 
323
351
  ### Dynamic Tool Selection & Visibility
324
352
 
325
- This MCP server supports dynamic toolset selection and visibility filtering at runtime. This allows you to restrict the set of exposed tools in order to prevent blowing up the LLM's context window.
353
+ This MCP server supports dynamic toolset selection and visibility filtering at runtime. This allows the operator to restrict the set of exposed tools to prevent blowing up the LLM's context window.
326
354
 
327
- You can configure tool filtering via multiple input channels:
355
+ The operator can configure tool filtering via multiple input channels:
328
356
 
329
357
  - **CLI Arguments:** Pass `--tools` or `--toolsets` (or their disabled counterparts `--disabled-tools` and `--disabled-toolsets`) during startup.
330
358
  - **Environment Variables:** Define standard environment variables:
@@ -333,7 +361,7 @@ You can configure tool filtering via multiple input channels:
333
361
  - **HTTP SSE Request Headers:** Pass custom headers during transport initialization:
334
362
  - `x-mcp-enabled-tools` / `x-mcp-disabled-tools`
335
363
  - `x-mcp-enabled-tags` / `x-mcp-disabled-tags`
336
- - **HTTP SSE Request Query Parameters:** Append query parameters directly to your transport connection URL:
364
+ - **HTTP SSE Request Query Parameters:** Append query parameters directly to the operator's transport connection URL:
337
365
  - `?tools=tool1,tool2`
338
366
  - `?tags=tag1`
339
367
 
@@ -345,11 +373,10 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
345
373
 
346
374
  <!-- MCP-CONFIG-EXAMPLES:START -->
347
375
 
348
- > **Install the slim `[mcp]` extra.** All examples install `gitlab-api[mcp]` — the
349
- > MCP-server extra that pulls only the FastMCP / FastAPI tooling (`agent-utilities[mcp]`).
350
- > It deliberately **excludes** the heavy agent runtime (`pydantic-ai`, the epistemic-graph
351
- > engine, `dspy`, `llama-index`), so `uvx` / container installs are far smaller. Use the
352
- > full `[agent]` extra only when you need the integrated Pydantic AI agent.
376
+ > **Install the connector-focused `[mcp]` extra.** Examples use `gitlab-api[mcp]` to add
377
+ > FastMCP / FastAPI through `agent-connector-sdk`; the required Agent Connector SDK core
378
+ > still carries `epistemic-graph[full]`. The `[agent-runtime]` extra additionally
379
+ > enables model orchestration.
353
380
 
354
381
  #### stdio Transport (local IDEs — Cursor, Claude Desktop, VS Code)
355
382
 
@@ -364,7 +391,7 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
364
391
  "gitlab-mcp"
365
392
  ],
366
393
  "env": {
367
- "MCP_TOOL_MODE": "condensed",
394
+ "MCP_TOOL_MODE": "intent",
368
395
  "BRANCHESTOOL": "True",
369
396
  "COMMITSTOOL": "True",
370
397
  "CUSTOM_APITOOL": "True",
@@ -404,6 +431,10 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
404
431
  }
405
432
  ```
406
433
 
434
+ Runtime references require an alias-aware launcher such as Arbora. Other
435
+ launchers must omit those entries and inject the resolved values through their
436
+ own runtime secret boundary.
437
+
407
438
  #### Streamable-HTTP Transport (networked / production)
408
439
 
409
440
  ```json
@@ -422,9 +453,9 @@ When query strings or parameters are supplied, an LLM-free **Knowledge Graph res
422
453
  ],
423
454
  "env": {
424
455
  "TRANSPORT": "streamable-http",
425
- "HOST": "0.0.0.0",
456
+ "HOST": "127.0.0.1",
426
457
  "PORT": "8000",
427
- "MCP_TOOL_MODE": "condensed",
458
+ "MCP_TOOL_MODE": "intent",
428
459
  "BRANCHESTOOL": "True",
429
460
  "COMMITSTOOL": "True",
430
461
  "CUSTOM_APITOOL": "True",
@@ -476,16 +507,18 @@ Alternatively, connect to a pre-deployed Streamable-HTTP instance by `url`:
476
507
  }
477
508
  ```
478
509
 
479
- Deploying the Streamable-HTTP server via Docker:
510
+ Run a reviewed container image as a least-privilege stdio child (no
511
+ listener or published port):
480
512
 
481
513
  ```bash
482
- docker run -d \
483
- --name gitlab-mcp-mcp \
484
- -p 8000:8000 \
485
- -e TRANSPORT=streamable-http \
486
- -e HOST=0.0.0.0 \
487
- -e PORT=8000 \
488
- -e MCP_TOOL_MODE=condensed \
514
+ docker run -i --rm \
515
+ --read-only \
516
+ --cap-drop=ALL \
517
+ --security-opt=no-new-privileges \
518
+ --pids-limit=256 \
519
+ --tmpfs /tmp:rw,noexec,nosuid,nodev,size=64m \
520
+ -e TRANSPORT=stdio \
521
+ -e MCP_TOOL_MODE=intent \
489
522
  -e BRANCHESTOOL=True \
490
523
  -e COMMITSTOOL=True \
491
524
  -e CUSTOM_APITOOL=True \
@@ -519,25 +552,30 @@ docker run -d \
519
552
  -e USERSTOOL=True \
520
553
  -e VULNERABILITIESTOOL=True \
521
554
  -e WIKITOOL=True \
522
- knucklessg1/gitlab-api:mcp
555
+ registry.example.invalid/gitlab-api@sha256:<digest> gitlab-mcp
523
556
  ```
524
557
 
558
+ For containerized network HTTP, supply an authenticated TLS ingress (or
559
+ direct server TLS), exact `MCP_ALLOWED_HOSTS`, and an exact trusted-proxy
560
+ CIDR policy through the operator-owned deployment profile. The generator
561
+ does not emit an unauthenticated non-loopback listener.
562
+
525
563
  _Auto-generated from the code-read env surface (`MCP_TOOL_MODE` + package vars) — do not edit._
526
564
  <!-- MCP-CONFIG-EXAMPLES:END -->
527
565
 
528
566
  <!-- BEGIN GENERATED: additional-deployment-options -->
529
567
  ### Additional Deployment Options
530
568
 
531
- `gitlab-api` can also run as a **local container** (Docker / Podman / `uv`) or be
532
- consumed from a **remote deployment**. The
533
- [Deployment guide](https://knuckles-team.github.io/gitlab-api/deployment/) has full, copy-paste
534
- `mcp_config.json` for all four transports — **stdio**, **streamable-http**,
535
- **local container / uv**, and **remote URL**:
569
+ `gitlab-api` can run as a local stdio process or container, or behind a remote
570
+ network boundary. The
571
+ [Deployment guide](https://knuckles-team.github.io/gitlab-api/deployment/) carries
572
+ the detailed transport contract.
536
573
 
537
- - **Local container / uv** — launch the server from `mcp_config.json` via `uvx`,
538
- `docker run`, or `podman run`, or point at a local streamable-http container by `url`.
539
- - **Remote URL** — connect to a server deployed behind Caddy at
540
- `http://gitlab-mcp.arpa/mcp` using the `"url"` key.
574
+ - **Local container** — launch a reviewed immutable image as a least-privilege
575
+ stdio child with no listener or published port.
576
+ - **Remote URL** — connect through an operator-supplied authenticated HTTPS
577
+ ingress. Keep its URL, outbound identity references, trust profile, and exact
578
+ `MCP_ALLOWED_HOSTS` in `AgentConfig`.
541
579
  <!-- END GENERATED: additional-deployment-options -->
542
580
 
543
581
  ---
@@ -555,15 +593,15 @@ consumed from a **remote deployment**. The
555
593
  | `TRANSPORT` | `stdio` | options: stdio, streamable-http, sse |
556
594
  | `ENABLE_OTEL` | `True` | |
557
595
  | `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:8080/api/public/otel` | |
558
- | `OTEL_EXPORTER_OTLP_PUBLIC_KEY` | `pk-...` | |
559
- | `OTEL_EXPORTER_OTLP_SECRET_KEY` | `sk-...` | |
596
+ | `OTEL_EXPORTER_OTLP_PUBLIC_KEY` | secret-injected | |
597
+ | `OTEL_EXPORTER_OTLP_SECRET_KEY` | secret-injected | |
560
598
  | `OTEL_EXPORTER_OTLP_PROTOCOL` | `http/protobuf` | |
561
599
  | `EUNOMIA_TYPE` | `none` | options: none, embedded, remote |
562
600
  | `EUNOMIA_POLICY_FILE` | `mcp_policies.json` | |
563
601
  | `EUNOMIA_REMOTE_URL` | `http://eunomia-server:8000` | |
564
602
  | `GITLAB_URL` | `https://gitlab.example.com` | |
565
- | `GITLAB_TOKEN` | `your_gitlab_token_here` | |
566
- | `GITLAB_SSL_VERIFY` | `True` | verify TLS certs; set False for self-signed homelab instances |
603
+ | `GITLAB_TOKEN` | secret-injected | |
604
+ | `GITLAB_TLS_PROFILE` | — | named AgentConfig TLS profile; blank uses the configured default |
567
605
  | `MISCTOOL` | `True` | |
568
606
  | `BRANCHESTOOL` | `True` | |
569
607
  | `PROTECTED_BRANCHESTOOL` | `True` | |
@@ -596,29 +634,29 @@ consumed from a **remote deployment**. The
596
634
  | `GRAPHQLTOOL` | `True` | |
597
635
  | `GRAPHQL_OPSTOOL` | `True` | |
598
636
 
599
- #### Inherited agent-utilities variables (apply to every connector)
637
+ #### Inherited agent-connector-sdk variables (apply to every connector)
600
638
 
601
639
  | Variable | Example | Description |
602
640
  |----------|---------|-------------|
603
- | `MCP_TOOL_MODE` | `condensed` | Tool surface: `condensed` | `verbose` | `both` |
641
+ | `MCP_TOOL_MODE` | `intent` | Tool surface: `intent` \| `condensed` \| `verbose` \| `both` |
604
642
  | `MCP_ENABLED_TOOLS` | — | Comma-separated tool allow-list |
605
643
  | `MCP_DISABLED_TOOLS` | — | Comma-separated tool deny-list |
606
644
  | `MCP_ENABLED_TAGS` | — | Comma-separated tag allow-list |
607
645
  | `MCP_DISABLED_TAGS` | — | Comma-separated tag deny-list |
608
- | `MCP_CLIENT_AUTH` | — | Outbound MCP auth (`oidc-client-credentials` for fleet calls) |
646
+ | `MCP_CLIENT_AUTH` | — | Outbound MCP child auth: `oidc-client-credentials` \| `basic` \| `none` |
609
647
  | `OIDC_CLIENT_ID` | — | OIDC client id (service-account auth) |
610
- | `OIDC_CLIENT_SECRET` | — | OIDC client secret (service-account auth) |
648
+ | `OIDC_CLIENT_SECRET_REF` | `secret://identity/oidc-client-secret` | Runtime secret reference for the OIDC service account |
649
+ | `MCP_BASIC_AUTH_USERNAME` | — | HTTP Basic username (`MCP_CLIENT_AUTH=basic`) |
650
+ | `MCP_BASIC_AUTH_PASSWORD_REF` | `secret://identity/mcp-basic-password` | Runtime secret reference for HTTP Basic auth (`MCP_CLIENT_AUTH=basic`) |
611
651
  | `DEBUG` | `False` | Verbose logging |
612
652
  | `PYTHONUNBUFFERED` | `1` | Unbuffered stdout (recommended in containers) |
613
653
  | `MCP_URL` | `http://localhost:8000/mcp` | URL of the MCP server the agent connects to |
614
654
  | `PROVIDER` | `openai` | LLM provider for the agent |
615
655
  | `MODEL_ID` | `gpt-4o` | Model id for the agent |
616
- | `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
617
656
 
618
- _45 package + 14 inherited variable(s). Auto-generated from `.env.example` + the shared agent-utilities set — do not edit._
657
+ _45 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared agent-connector-sdk set — do not edit._
619
658
  <!-- ENV-VARS-TABLE:END -->
620
659
 
621
-
622
660
  Every variable the server reads.
623
661
 
624
662
  ### Connection & Credentials
@@ -630,11 +668,11 @@ instances are configured, it falls back to the single-host `GITLAB_*` values bel
630
668
  |----------|-------------|---------|
631
669
  | `GITLAB_URL` | Base GitLab instance URL | `https://gitlab.example.com` |
632
670
  | `GITLAB_TOKEN` | GitLab personal/project access token (`glpat-…`) | — |
633
- | `GITLAB_SSL_VERIFY` | TLS certificate verification | `True` |
671
+ | `GITLAB_TLS_PROFILE` | Optional runtime TLS profile selector | _(unset)_ |
634
672
 
635
673
  > Multiple instances are declared once under `gitlab_instances` in the shared
636
- > agent-utilities XDG config (`~/.config/agent-utilities/config.json`) — each entry has
637
- > `name`, `url`, `token`, and `verify_ssl`. Target a tenant by **name** from the client
674
+ > agent-connector-sdk XDG config (`~/.config/agent-connector-sdk/config.json`) — each entry has
675
+ > `name`, `url`, `token`, and optional `tls_profile`. Target a tenant by **name** from the client
638
676
  > factory; an unset instance resolves to the first configured one (else `GITLAB_URL` /
639
677
  > `GITLAB_TOKEN`).
640
678
 
@@ -666,257 +704,26 @@ The full list is in the [Available MCP Tools](#available-mcp-tools) table above
666
704
  | `EUNOMIA_POLICY_FILE` | Embedded policy file | `mcp_policies.json` |
667
705
  | `EUNOMIA_REMOTE_URL` | Remote Eunomia server URL | — |
668
706
 
669
- ### Agent CLI (full `[agent]` runtime only)
670
- | Variable | Description | Default |
671
- |----------|-------------|---------|
672
- | `MCP_URL` | URL of the MCP server the agent connects to | `http://localhost:8000/mcp` |
673
- | `PROVIDER` | LLM provider (e.g. `openai`) | `openai` |
674
- | `MODEL_ID` | Model id (e.g. `gpt-4o`) | `gpt-4o` |
675
- | `ENABLE_WEB_UI` | Serve the AG-UI web interface | `True` |
676
-
677
- See [`.env.example`](.env.example) for a copy-paste starting point.
678
-
679
707
  ## Agent
680
708
 
681
- This repository features a fully integrated Pydantic AI Graph Agent. It communicates over the **Agent Control Protocol (ACP)** and interacts seamlessly with the **Agent Web UI (AG-UI)** and Terminal interface.
682
-
683
- ### Running the Agent CLI
684
- To start the interactive command-line agent:
685
-
686
- ```bash
687
709
  # Set credentials
688
710
  export GITLAB_URL="your_value"
689
711
  export GITLAB_TOKEN="your_value"
690
712
 
691
- # Run the agent server
692
- gitlab-agent --provider openai --model-id gpt-4o
693
- ```
694
-
695
- ### Docker Compose Orchestration
696
- The following `docker/agent.compose.yml` configures the Agent, Web UI, and Terminal Interface together:
697
-
698
- ```yaml
699
- version: '3.8'
700
-
701
- services:
702
- gitlab-api-mcp:
703
- image: knucklessg1/gitlab-api:mcp
704
- container_name: gitlab-api-mcp
705
- hostname: gitlab-api-mcp
706
- restart: always
707
- env_file:
708
- - ../.env
709
- environment:
710
- - PYTHONUNBUFFERED=1
711
- - HOST=0.0.0.0
712
- - PORT=8000
713
- - TRANSPORT=streamable-http
714
- ports:
715
- - "8000:8000"
716
- healthcheck:
717
- test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
718
- interval: 30s
719
- timeout: 10s
720
- retries: 3
721
- start_period: 10s
722
- logging:
723
- driver: json-file
724
- options:
725
- max-size: "10m"
726
- max-file: "3"
727
-
728
- gitlab-api-agent:
729
- image: knucklessg1/gitlab-api:latest
730
- container_name: gitlab-api-agent
731
- hostname: gitlab-api-agent
732
- restart: always
733
- depends_on:
734
- - gitlab-api-mcp
735
- env_file:
736
- - ../.env
737
- command: [ "gitlab-agent" ]
738
- environment:
739
- - PYTHONUNBUFFERED=1
740
- - HOST=0.0.0.0
741
- - PORT=9017
742
- - MCP_URL=http://gitlab-api-mcp:8000/mcp
743
- - PROVIDER=${PROVIDER:-openai}
744
- - MODEL_ID=${MODEL_ID:-gpt-4o}
745
- - ENABLE_WEB_UI=True
746
- - ENABLE_OTEL=True
747
- ports:
748
- - "9017:9017"
749
- healthcheck:
750
- test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9017/health')"]
751
- interval: 30s
752
- timeout: 10s
753
- retries: 3
754
- start_period: 10s
755
- logging:
756
- driver: json-file
757
- options:
758
- max-size: "10m"
759
- max-file: "3"
760
-
761
- ```
762
-
763
- Detailed graph node architecture explanations, custom skill configurations, and agentic trace guides are available in [docs/agent.md](docs/agent.md).
764
-
765
- ---
766
-
767
- ## Multi-Tenancy (multiple GitLab instances)
768
-
769
- The client is natively multi-tenant. The set of instances is declared once in the
770
- shared **agent-utilities XDG config** (`~/.config/agent-utilities/config.json`) under
771
- `gitlab_instances` — the **same** list the Knowledge-Graph GitLab indexer reads, so one
772
- config drives both code/metadata indexing and every API/MCP call:
773
-
774
- ```json
775
- {
776
- "gitlab_instances": [
777
- {"name": "internal", "url": "https://gitlab.arpa", "token": "glpat-xxxx", "verify_ssl": false},
778
- {"name": "public", "url": "https://gitlab.com", "token": "glpat-yyyy", "verify_ssl": true}
779
- ]
780
- }
781
- ```
782
-
783
- Target a tenant by **name** from the client factory; a bare URL still works, and an
784
- unset instance resolves to the first configured one (else `GITLAB_URL`/`GITLAB_TOKEN`):
785
-
786
- ```python
787
- from gitlab_api.auth import get_client
788
- from gitlab_api.instances import list_configured_instances
789
-
790
- internal = get_client(instance="internal") # resolves url+token+verify from config
791
- public = get_client(instance="public")
792
- default = get_client() # first configured / GITLAB_URL fallback
793
- names = [i.name for i in list_configured_instances()]
794
- ```
795
-
796
- The MCP server exposes a `gitlab_instances` tool (`action=list|get`) to discover the
797
- configured tenants (tokens are never returned). When no instances are configured, the
798
- connector falls back to the single-host `GITLAB_URL`/`GITLAB_TOKEN` it has always used.
799
-
800
- ## Security & Governance
801
-
802
- Built directly upon the enterprise-ready [`agent-utilities`](https://github.com/Knuckles-Team/agent-utilities) core, standard security parameters are fully supported:
803
-
804
- ### Access Control & Policy Enforcement
805
- - **Eunomia Policies:** Fine-grained, policy-driven tool authorization. Supports `none`, local `embedded` (`mcp_policies.json`), or centralized `remote` modes.
806
- - **OIDC Token Delegation:** Compliant with RFC 8693 token exchange for flowing authenticating user credentials from Web UI / ACP → Agent → MCP.
807
- - **Scoped Credentials:** Execution context runs restricted to the specific caller identity.
808
-
809
- ### Runtime Security Grid
810
- | Feature | Functionality | Enablement |
811
- |---------|---------------|------------|
812
- | **Tool Guard** | Sensitivity inspection with human-in-the-loop validation | Enabled by default |
813
- | **Prompt Injection Defense** | Input scanning, repetition monitoring, and recursive loop blocks | Enabled by default |
814
- | **Context Safety Guard** | Stuck-loop detectors and contextual overflow preemptive alerts | Enabled by default |
815
-
816
- ---
817
-
818
- ## Installation
819
-
820
- Pick the extra that matches what you want to run:
821
-
822
- | Extra | Installs | Use when |
823
- |-------|----------|----------|
824
- | `gitlab-api[mcp]` | Slim MCP server only (`agent-utilities[mcp]` — FastMCP/FastAPI) | You only run the **MCP server** (smallest install / image) |
825
- | `gitlab-api[agent]` | Full agent runtime (`agent-utilities[agent,logfire]` — Pydantic AI + the epistemic-graph engine) | You run the **integrated agent** |
826
- | `gitlab-api[all]` | Everything (`mcp` + `agent` + `gql` + `logfire`) | Development / both surfaces |
827
-
828
- ```bash
829
- # MCP server only (recommended for tool hosting — slim deps)
713
+ # Connector-focused MCP server (includes the shared graph engine)
830
714
  uv pip install "gitlab-api[mcp]"
831
715
 
832
- # Full agent runtime (Pydantic AI + epistemic-graph engine)
833
- uv pip install "gitlab-api[agent]"
834
-
835
716
  # Everything (development)
836
717
  uv pip install "gitlab-api[all]" # or: python -m pip install "gitlab-api[all]"
837
718
  ```
838
719
 
839
- ### Container images (`:mcp` vs `:agent`)
720
+ ### Container images (`:mcp`)
840
721
 
841
- One multi-stage `docker/Dockerfile` builds two right-sized images, selected by `--target`:
722
+ One multi-stage `docker/Dockerfile` builds the MCP-only image (`--target mcp`):
842
723
 
843
724
  | Image tag | Build target | Contents | Entrypoint |
844
725
  |-----------|--------------|----------|------------|
845
- | `knucklessg1/gitlab-api:mcp` | `--target mcp` | `gitlab-api[mcp]` — **slim**, no engine/`pydantic-ai`/`dspy`/`llama-index`/`tree-sitter` | `gitlab-mcp` |
846
- | `knucklessg1/gitlab-api:latest` | `--target agent` (default) | `gitlab-api[agent]` — **full** agent runtime + epistemic-graph engine | `gitlab-agent` |
726
+ | `example/gitlab-api:mcp` | `--target mcp` | `gitlab-api[mcp]` — **connector-focused**, includes `epistemic-graph[full]`; no model-orchestration stack | `gitlab-mcp` |
847
727
 
848
728
  ```bash
849
- docker build --target mcp -t knucklessg1/gitlab-api:mcp docker/ # slim MCP server
850
- docker build --target agent -t knucklessg1/gitlab-api:latest docker/ # full agent
851
- ```
852
-
853
- `docker/mcp.compose.yml` runs the slim `:mcp` server; `docker/agent.compose.yml` runs the
854
- agent (`:latest`) with a co-located `:mcp` sidecar.
855
-
856
- ### Knowledge-graph database (`epistemic-graph`)
857
-
858
- The **full agent** (`[agent]` / `:latest`) embeds the **epistemic-graph** engine (pulled in
859
- transitively via `agent-utilities[agent]`). For production — or to share one knowledge graph
860
- across multiple agents — run **epistemic-graph as its own database container** and point the
861
- agent at it instead of embedding it. Deployment recipes (single-node + Raft HA), connection
862
- config, and the full database architecture (with diagrams) are documented in the
863
- [epistemic-graph deployment guide](https://knuckles-team.github.io/epistemic-graph/deployment/).
864
- The slim `[mcp]` server does **not** require the database.
865
-
866
- ---
867
-
868
- ## Documentation
869
-
870
- The complete documentation is published as the
871
- [official documentation site](https://knuckles-team.github.io/gitlab-api/) and is the
872
- recommended reference for installation, deployment, and day-to-day operation.
873
-
874
- | Page | Contents |
875
- |---|---|
876
- | [Installation](https://knuckles-team.github.io/gitlab-api/installation/) | pip, source, extras, prebuilt Docker image |
877
- | [Deployment](https://knuckles-team.github.io/gitlab-api/deployment/) | run the MCP and agent servers, Compose, Caddy + Technitium, env config |
878
- | [Usage](https://knuckles-team.github.io/gitlab-api/usage/) | the MCP tools, the `Api` client, the CLI |
879
- | [Backing Platform](https://knuckles-team.github.io/gitlab-api/platform/) | deploy GitLab with Docker |
880
- | [Overview](https://knuckles-team.github.io/gitlab-api/overview/) | the action-routed tool surface and architecture |
881
- | [Concepts](https://knuckles-team.github.io/gitlab-api/concepts/) | concept registry (`CONCEPT:GL-*`) |
882
-
883
- ---
884
-
885
- ## Repository Owners
886
-
887
- <img width="100%" height="180em" src="https://github-readme-stats.vercel.app/api?username=Knucklessg1&show_icons=true&hide_border=true&&count_private=true&include_all_commits=true" />
888
-
889
- ![GitHub followers](https://img.shields.io/github/followers/Knucklessg1)
890
- ![GitHub User's stars](https://img.shields.io/github/stars/Knucklessg1)
891
-
892
- ---
893
-
894
- ## Contribute
895
-
896
- Contributions are welcome! Please ensure code quality by executing local checks before submitting pull requests:
897
- - Format code using `ruff format .`
898
- - Lint code using `ruff check .`
899
- - Validate type-safety with `mypy .`
900
- - Execute test suites using `pytest`
901
-
902
-
903
- <!-- BEGIN agent-os-genesis-deploy (generated; do not edit between markers) -->
904
-
905
- ## Deploy with `agent-os-genesis`
906
-
907
- This package can be provisioned for you — skill-guided — by the **`agent-os-genesis`**
908
- universal skill (its *single-package deploy mode*): it picks your install method, seeds
909
- secrets to OpenBao/Vault (or `.env`), trusts your enterprise CA, registers the MCP
910
- server, and verifies it — the same machinery that stands up the whole Agent OS, narrowed
911
- to just this package. Ask your agent to **"deploy `gitlab-api` with agent-os-genesis"**.
912
-
913
- | Install mode | Command |
914
- |------|---------|
915
- | Bare-metal, prod (PyPI) | `uvx gitlab-mcp` · or `uv tool install gitlab-api` |
916
- | Bare-metal, dev (editable) | `uv pip install -e ".[all]"` · or `pip install -e ".[all]"` |
917
- | Container, prod | deploy `knucklessg1/gitlab-api:latest` via docker-compose / swarm / podman / podman-compose / kubernetes |
918
- | Container, dev (editable) | deploy `docker/compose.dev.yml` (source-mounted at `/src`; edits live on restart) |
919
-
920
- Secrets are read-existing + seeded via `vault_sync` — you are only prompted for what's missing.
921
-
922
- <!-- END agent-os-genesis-deploy -->
729
+ docker build --target mcp -t example/gitlab-api:mcp docker/ # connector-focused MCP server