{"_id":"@alexsarrell/gitlab-mcp-server","_rev":"6-47eb55df6227f5a4e0f82709c1e57c80","name":"@alexsarrell/gitlab-mcp-server","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@alexsarrell/gitlab-mcp-server","version":"0.1.0","keywords":["mcp","gitlab","ai"],"license":"MIT","_id":"@alexsarrell/gitlab-mcp-server@0.1.0","maintainers":[{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"}],"bin":{"gitlab-mcp":"dist/index.js"},"dist":{"shasum":"496c0aefdc7196cd663b4f501faf05dd42d93b26","tarball":"https://registry.npmjs.org/@alexsarrell/gitlab-mcp-server/-/gitlab-mcp-server-0.1.0.tgz","fileCount":59,"integrity":"sha512-wvTqKVcr94EYT7rR3yHr2HJrLliBBEJASEPhSq1mbEs1+us8++Ofmowyvx6aylONlCyLd8Kt/j2kzQUBYV7OMg==","signatures":[{"sig":"MEUCIQCY0z7XPRYhMikyKKBRs4xr+Iqbedoq6cPt4/cP62tmngIgLINm9HPALipaHGtGlPUj9LrNTsZwswZ0JEGq3UJuLRs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":434886},"main":"dist/index.js","type":"module","gitHead":"3b2d2d6ba024b352224acf946418dfc47bccdcf3","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"},"_npmVersion":"10.9.2","description":"GitLab MCP server for self-hosted GitLab instances","directories":{},"_nodeVersion":"22.17.1","dependencies":{"ajv":"^8.18.0","zod":"^4.3.6","casbin":"^5.49.0","js-yaml":"^4.1.1","lru-cache":"^11.3.3","minimatch":"^10.2.5","@gitbeaker/rest":"^43.8.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","vitest":"^4.1.3","typescript":"^6.0.2","@types/node":"^25.5.2","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/gitlab-mcp-server_0.1.0_1775728597685_0.5052546439814021","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@alexsarrell/gitlab-mcp-server","version":"0.1.1","keywords":["mcp","gitlab","ai"],"license":"MIT","_id":"@alexsarrell/gitlab-mcp-server@0.1.1","maintainers":[{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"}],"bin":{"gitlab-mcp":"dist/index.js"},"dist":{"shasum":"f5c04371cc79d80af14553477dcae93ebb8e806d","tarball":"https://registry.npmjs.org/@alexsarrell/gitlab-mcp-server/-/gitlab-mcp-server-0.1.1.tgz","fileCount":59,"integrity":"sha512-Q8UyTFo6SiHmCTmws4aIWBRFAUep+7WmtS/bRwUly6zgJAYfNuq8u+4zoc8SEPO2TjZiTpSq1xIi63pIsbkf6A==","signatures":[{"sig":"MEUCIDYhvINkeHgeK+kfSUDlGOlBG7E7nNnyIf9d4zfxV9sWAiEAsbJ8fFNILALwGg0ybP2NcFXckZ4ufUsbYQbVzyhZkPs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":422009},"main":"dist/index.js","type":"module","gitHead":"c4ff24838c0c4ac04724bba7f648e95ee5a0f438","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"},"_npmVersion":"10.9.2","description":"GitLab MCP server for self-hosted GitLab instances","directories":{},"_nodeVersion":"22.17.1","dependencies":{"ajv":"^8.18.0","zod":"^4.3.6","casbin":"^5.49.0","js-yaml":"^4.1.1","lru-cache":"^11.3.3","minimatch":"^10.2.5","@gitbeaker/rest":"^43.8.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","vitest":"^4.1.3","typescript":"^6.0.2","@types/node":"^25.5.2","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/gitlab-mcp-server_0.1.1_1775730178649_0.5974989936521993","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@alexsarrell/gitlab-mcp-server","version":"0.1.2","keywords":["mcp","gitlab","ai"],"license":"MIT","_id":"@alexsarrell/gitlab-mcp-server@0.1.2","maintainers":[{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"}],"bin":{"gitlab-mcp":"dist/index.js"},"dist":{"shasum":"890aaf151c56814548b1faae31fbfdccdae68e4e","tarball":"https://registry.npmjs.org/@alexsarrell/gitlab-mcp-server/-/gitlab-mcp-server-0.1.2.tgz","fileCount":59,"integrity":"sha512-h4PSVwZEUy0afuI7w5FwxmLjK+R3X9zmqKTW2EMiP+yOxZL4tNu+PEo75eSwcJbskbcbi5HEQ5dvSH31lCQdHQ==","signatures":[{"sig":"MEYCIQCuGt63DKvrK6X2YPX52Tn5QOySp/lihBxnBfRUYTXOkgIhAOFbWaFU7nff/W4C0GL/6zSNRSsS2FEHrHcY703AiwHB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":428509},"main":"dist/index.js","type":"module","gitHead":"c18e3ab08fad5c542bd4105f3623d15dc85df99c","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"},"_npmVersion":"10.9.2","description":"GitLab MCP server for self-hosted GitLab instances","directories":{},"_nodeVersion":"22.17.1","dependencies":{"ajv":"^8.18.0","zod":"^4.3.6","casbin":"^5.49.0","js-yaml":"^4.1.1","lru-cache":"^11.3.3","minimatch":"^10.2.5","@gitbeaker/rest":"^43.8.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","vitest":"^4.1.3","typescript":"^6.0.2","@types/node":"^25.5.2","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/gitlab-mcp-server_0.1.2_1775730729438_0.37188499073539316","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@alexsarrell/gitlab-mcp-server","version":"0.1.3","keywords":["mcp","gitlab","ai"],"license":"MIT","_id":"@alexsarrell/gitlab-mcp-server@0.1.3","maintainers":[{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"}],"bin":{"gitlab-mcp":"dist/index.js"},"dist":{"shasum":"5e5436ae87190c6ffc896ea56cef9050eb0a373e","tarball":"https://registry.npmjs.org/@alexsarrell/gitlab-mcp-server/-/gitlab-mcp-server-0.1.3.tgz","fileCount":59,"integrity":"sha512-SLdbb7LpsGxdLX6Z8NDYTe4y5diaV7ohkreADf+P7XwP7F2y9p/VruCCpRUpWAZYq8L9AxPHbQBQ3ZtGA90ZcA==","signatures":[{"sig":"MEQCIE4q2zAGrQBKOcERUT+lVpOn1EZbViLfwwhrc/G9WPoDAiBANI/9bSFCzIfvVNcoUxTb0mTyVfNscoQjCXcNCqRw9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":429658},"main":"dist/index.js","type":"module","gitHead":"a79cebb2590bdb6734428373262ba9b9d38e3dab","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"},"_npmVersion":"10.9.2","description":"GitLab MCP server for self-hosted GitLab instances","directories":{},"_nodeVersion":"22.17.1","dependencies":{"ajv":"^8.18.0","zod":"^4.3.6","casbin":"^5.49.0","js-yaml":"^4.1.1","lru-cache":"^11.3.3","minimatch":"^10.2.5","@gitbeaker/rest":"^43.8.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","vitest":"^4.1.3","typescript":"^6.0.2","@types/node":"^25.5.2","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/gitlab-mcp-server_0.1.3_1775733019644_0.6708640071363641","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@alexsarrell/gitlab-mcp-server","version":"0.2.0","keywords":["mcp","gitlab","ai"],"license":"MIT","_id":"@alexsarrell/gitlab-mcp-server@0.2.0","maintainers":[{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"}],"bin":{"gitlab-mcp":"dist/index.js"},"dist":{"shasum":"3f98931b9f55d8a13cfc94c25c87332b4bad70ed","tarball":"https://registry.npmjs.org/@alexsarrell/gitlab-mcp-server/-/gitlab-mcp-server-0.2.0.tgz","fileCount":75,"integrity":"sha512-Wj6WWuZnYlwMa5zzyfz4ZAvq5Ye1R9nJRqLYsjBQ+I2GrlWdTfE4WLhu/aAQOrgcpsDzrVtzjA8+EZsd4d5MaA==","signatures":[{"sig":"MEQCIEKLz8fLqM7yCmCljgntnx1L9NN9mYBqKtK/MxJSdTtsAiAnG+zgt+Ka/14R4mY9Q6ERUhZ3rmN2Cp8M48KkNu2pnw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":513616},"main":"dist/index.js","type":"module","gitHead":"f79a9f3ce1c6c5e5a6f3a5dc0eaf7dbf5ded7be6","scripts":{"dev":"tsx src/index.ts","lint":"tsc --noEmit","test":"vitest run","build":"tsup","test:watch":"vitest"},"_npmUser":{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"},"_npmVersion":"10.9.2","description":"GitLab MCP server for self-hosted GitLab instances","directories":{},"_nodeVersion":"22.17.1","dependencies":{"ajv":"^8.18.0","zod":"^4.3.6","casbin":"^5.49.0","js-yaml":"^4.1.1","lru-cache":"^11.3.3","minimatch":"^10.2.5","@gitbeaker/rest":"^43.8.0","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","tsup":"^8.5.1","vitest":"^4.1.3","typescript":"^6.0.2","@types/node":"^25.5.2","@types/js-yaml":"^4.0.9"},"_npmOperationalInternal":{"tmp":"tmp/gitlab-mcp-server_0.2.0_1775733979473_0.2710254034831292","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@alexsarrell/gitlab-mcp-server","version":"0.6.0","description":"GitLab MCP server for self-hosted GitLab instances","type":"module","main":"dist/index.js","bin":{"gitlab-mcp":"dist/index.js"},"scripts":{"build":"tsup","dev":"tsx src/index.ts","test":"vitest run","test:watch":"vitest","lint":"tsc --noEmit"},"keywords":["mcp","gitlab","ai"],"license":"MIT","dependencies":{"@gitbeaker/rest":"^43.8.0","@modelcontextprotocol/sdk":"^1.29.0","ajv":"^8.18.0","casbin":"^5.49.0","js-yaml":"^4.1.1","lru-cache":"^11.3.3","minimatch":"^10.2.5","zod":"^4.3.6"},"devDependencies":{"@types/js-yaml":"^4.0.9","@types/node":"^25.5.2","tsup":"^8.5.1","tsx":"^4.21.0","typescript":"^6.0.2","vitest":"^4.1.3"},"_id":"@alexsarrell/gitlab-mcp-server@0.6.0","gitHead":"98855ef2fa2683fc9a7a68e5a6f933c809003380","_nodeVersion":"22.17.1","_npmVersion":"10.9.2","dist":{"integrity":"sha512-sMsqQ9hMa/xifrHxRghYRnuKU+gidhvlOSe/ARh1vgqy3R5yNP5a1dwQFuojn2XTxy07ACMW4sSv+5IJnEZ5LA==","shasum":"a90532d7e92148afde88492c70777aceed20290d","tarball":"https://registry.npmjs.org/@alexsarrell/gitlab-mcp-server/-/gitlab-mcp-server-0.6.0.tgz","fileCount":84,"unpackedSize":600400,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGQTOQVGFQh/uGBNZ9GJWDxZeAuDZFlt6FQYoorYUG6yAiEAroJZ3LhYa5uKkJZobjWXT2fsuZ3iCf8l76zvf14Mndc="}]},"_npmUser":{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"},"directories":{},"maintainers":[{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/gitlab-mcp-server_0.6.0_1778759867632_0.663524596695646"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-09T09:56:37.560Z","modified":"2026-05-14T11:57:47.905Z","0.1.0":"2026-04-09T09:56:37.855Z","0.1.1":"2026-04-09T10:22:58.790Z","0.1.2":"2026-04-09T10:32:09.610Z","0.1.3":"2026-04-09T11:10:19.815Z","0.2.0":"2026-04-09T11:26:19.646Z","0.6.0":"2026-05-14T11:57:47.780Z"},"license":"MIT","keywords":["mcp","gitlab","ai"],"description":"GitLab MCP server for self-hosted GitLab instances","maintainers":[{"name":"alexsarrell","email":"alexsarrell.workspace@gmail.com"}],"readme":"# @alexsarrell/gitlab-mcp-server\n\nMCP (Model Context Protocol) сервер для self-hosted GitLab. Позволяет AI-ассистентам (Claude Code, Cursor, Windsurf и др.) работать с GitLab через стандартный MCP-протокол.\n\nРазработан для [gitlab.just-ai.com](https://gitlab.just-ai.com), но работает с любым GitLab инстансом (self-hosted или gitlab.com).\n\n## Возможности\n\n- **49 MCP tools** — проекты, файлы, MR, issues, пайплайны, коммиты, ветки, теги, группы, раннеры, окружения, реестр образов и др.\n- **Настраиваемые политики доступа** — RBAC + ABAC через Casbin, YAML-профили с наследованием\n- **Безопасность** — hardcoded deny list опасных операций, secret detection в output, deny-list файлов\n- **Rate limiting** — per-session, burst allowance, лимиты на тяжёлые операции\n- **Audit logging** — structured JSON в stderr, неотключаемый\n- **Zero-config режим** — работает только с env vars, без YAML файла\n\n## Быстрый старт\n\n### Claude Code / Claude Desktop\n\nДобавьте в `~/.claude.json` (или `claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"gitlab\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@alexsarrell/gitlab-mcp-server\"],\n      \"env\": {\n        \"GITLAB_URL\": \"https://gitlab.example.com\",\n        \"GITLAB_MCP_TOKEN\": \"glpat-xxxxxxxxxxxxxxxxxxxx\"\n      }\n    }\n  }\n}\n```\n\nГотово. Сервер стартует с дефолтным профилем — все read/write операции разрешены, secret detection включён.\n\n### С YAML-конфигом (гранулярные политики)\n\n```json\n{\n  \"mcpServers\": {\n    \"gitlab\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@alexsarrell/gitlab-mcp-server\"],\n      \"env\": {\n        \"GITLAB_MCP_TOKEN\": \"glpat-xxxxxxxxxxxxxxxxxxxx\",\n        \"GITLAB_MCP_CONFIG\": \"/path/to/gitlab-mcp.config.yaml\"\n      }\n    }\n  }\n}\n```\n\n## Переменные окружения\n\n| Переменная | Обязательная | Описание |\n|-----------|-------------|----------|\n| `GITLAB_MCP_TOKEN` | Да | GitLab Personal/Project/Group Access Token |\n| `GITLAB_URL` | Нет* | URL GitLab инстанса (e.g. `https://gitlab.example.com`) |\n| `GITLAB_MCP_CONFIG` | Нет | Путь к YAML конфигу |\n\n\\* Обязательна в zero-config режиме (без YAML файла). В YAML конфиге задаётся через `gitlab.url`.\n\n## Токены\n\nРекомендуемые scopes для токена:\n\n| Scope | Для чего |\n|-------|----------|\n| `read_api` | Чтение проектов, MR, issues, пайплайнов |\n| `read_repository` | Чтение файлов из репозиториев |\n| `write_repository` | Создание веток |\n| `api` | Полный доступ (write-операции: MR, issues, comments, pipelines) |\n\nМинимальный набор для read-only: `read_api` + `read_repository`.\n\n## MCP Tools (49)\n\n### Проекты и группы\n\n| Tool | Описание |\n|------|----------|\n| `project_list` | Список проектов (поиск, пагинация) |\n| `project_info` | Детали проекта |\n| `group_list` | Список групп |\n| `group_info` | Детали группы |\n| `member_list` | Участники проекта или группы |\n\n### Файлы и код\n\n| Tool | Описание |\n|------|----------|\n| `file_read` | Чтение файла из репо (с блокировкой .env, .pem и др.) |\n| `file_list` | Содержимое директории |\n| `file_tree` | Рекурсивное дерево файлов |\n| `search_code` | Поиск по коду |\n\n### Merge Requests\n\n| Tool | Описание |\n|------|----------|\n| `mr_list` | Список MR (фильтр по state, поиск) |\n| `mr_get` | Детали MR |\n| `mr_diff` | Diff MR (изменённые файлы) |\n| `mr_create` | Создание MR |\n| `mr_update` | Обновление MR (title, description, labels, assignees) |\n| `mr_merge` | Merge MR (squash, remove source branch) |\n| `mr_approve` | Approve MR |\n| `mr_discussions` | Discussion threads MR (с resolved-статусом) |\n\n### Issues\n\n| Tool | Описание |\n|------|----------|\n| `issue_list` | Список issues (фильтр, поиск, labels) |\n| `issue_get` | Детали issue |\n| `issue_create` | Создание issue |\n| `issue_update` | Обновление issue (title, labels, state, assignees) |\n| `search_issues` | Поиск по issues |\n| `search_mrs` | Поиск по MR |\n\n### Комментарии\n\n| Tool | Описание |\n|------|----------|\n| `comment_list` | Комментарии к MR или issue |\n| `comment_create` | Новый комментарий (markdown) |\n| `comment_reply` | Ответ на discussion thread в MR |\n\n### CI/CD\n\n| Tool | Описание |\n|------|----------|\n| `pipeline_status` | Статус пайплайна + все джобы и стейджи |\n| `pipeline_logs` | Логи CI-джобы (secrets автоматически маскируются) |\n| `pipeline_trigger` | Запуск пайплайна (с переменными) |\n| `pipeline_retry` | Перезапуск упавшего пайплайна |\n| `pipeline_cancel` | Отмена пайплайна |\n| `ci_lint` | Валидация `.gitlab-ci.yml` |\n| `runner_list` | Список CI-раннеров проекта (статус, теги) |\n| `variable_list` | CI/CD переменные (только ключи, без значений!) |\n\n### Git (коммиты, ветки, теги)\n\n| Tool | Описание |\n|------|----------|\n| `commit_list` | История коммитов (фильтр по ветке, файлу) |\n| `commit_get` | Детали коммита (автор, stats) |\n| `commit_diff` | Diff коммита |\n| `branch_list` | Список веток |\n| `branch_create` | Создание ветки |\n| `branch_delete` | Удаление ветки |\n| `tag_list` | Список тегов |\n| `tag_create` | Создание тега |\n| `label_list` | Метки проекта |\n| `label_create` | Создание метки |\n\n### Инфраструктура\n\n| Tool | Описание |\n|------|----------|\n| `environment_list` | Окружения (staging, production) |\n| `environment_get` | Детали окружения + последний деплой |\n| `registry_list` | Container Registry — репозитории образов |\n| `registry_tags` | Теги (версии) образов в реестре |\n| `event_list` | Лента активности проекта (pushes, MR, comments) |\n\n## Конфигурация (YAML)\n\nПример конфига с политиками доступа:\n\n```yaml\nversion: \"1\"\n\ngitlab:\n  url: \"https://gitlab.example.com\"\n\ndefaults:\n  role: reader\n\nprofiles:\n  reader:\n    tools:\n      allow: [\"project_*\", \"file_*\", \"mr_list\", \"mr_get\", \"mr_diff\",\n              \"issue_*\", \"search_*\", \"pipeline_status\", \"pipeline_logs\",\n              \"comment_list\", \"branch_list\", \"label_list\", \"commit_*\",\n              \"tag_list\", \"group_*\", \"member_*\", \"runner_*\",\n              \"environment_*\", \"registry_*\", \"variable_*\", \"event_*\"]\n\n  contributor:\n    extends: reader\n    tools:\n      allow: [\"mr_create\", \"mr_update\", \"issue_create\", \"issue_update\",\n              \"comment_create\", \"comment_reply\", \"pipeline_trigger\",\n              \"branch_create\", \"label_create\", \"ci_lint\", \"tag_create\"]\n\n  maintainer:\n    extends: contributor\n    tools:\n      allow: [\"mr_merge\", \"mr_approve\", \"branch_delete\",\n              \"pipeline_retry\", \"pipeline_cancel\"]\n\npolicies:\n  # Все проекты группы — contributor\n  - match: \"group:my-team/**\"\n    profile: contributor\n\n  # Инфра-проекты — только чтение\n  - match: \"group:my-team/infra/**\"\n    profile: reader\n\n  # Core-проект — полный доступ\n  - match: \"project:my-team/platform/core\"\n    profile: maintainer\n\n  # Секретный проект — запрет на чтение файлов\n  - match: \"project:my-team/infra/secrets\"\n    profile: reader\n    tools:\n      deny: [\"file_read\"]\n\nrate_limits:\n  per_session: 60        # запросов в минуту\n  per_token: 120         # агрегированно по всем сессиям\n  burst_multiplier: 2    # допустимый burst\n  burst_window_sec: 10\n  heavy_ops:\n    \"pipeline_trigger\": 10   # в час\n    \"mr_create\": 20          # в час\n\nsecurity:\n  secret_detection: true\n  denied_file_patterns:\n    - \".env*\"\n    - \"*.pem\"\n    - \"*.key\"\n    - \"*secret*\"\n    - \"*credential*\"\n    - \"id_rsa*\"\n```\n\n### Наследование политик\n\n- Профили поддерживают `extends` — `contributor` наследует все права `reader`\n- Приоритет: project policy > group policy > defaults\n- `deny` всегда побеждает `allow` на любом уровне\n- MCP политики могут только **сужать** права GitLab-токена, не расширять\n\n## Безопасность\n\n### Запрещённые операции (hardcoded, не настраивается)\n\nЭти операции заблокированы всегда, независимо от конфигурации:\n\n- Удаление проектов и групп\n- Transfer проекта между группами\n- Экспорт проекта\n- Форк в чужой namespace\n- Управление пользователями\n- Системные admin-настройки\n- SSH-ключи и deploy keys с write-доступом\n\n### Secret Detection\n\nАвтоматическая маскировка секретов в output:\n\n- GitLab PAT (`glpat-*`)\n- GitLab Deploy Tokens (`gldt-*`)\n- Private keys (PEM)\n- AWS Access Keys (`AKIA*`)\n- Пароли в URL\n- GitHub tokens\n\nСекреты заменяются на `[REDACTED:тип]`, а не блокируются — AI видит, что секрет был, но не видит значение.\n\n### Запрещённые файлы\n\nПо умолчанию блокируется чтение: `.env*`, `*.pem`, `*.key`, `*secret*`, `*credential*`, `id_rsa*`, `kubeconfig`.\n\n### CI/CD переменные\n\nTool `variable_list` возвращает только ключи и метаданные (protected, masked), **никогда не возвращает значения**.\n\n## Audit Logging\n\nКаждое действие логируется в stderr как structured JSON:\n\n```json\n{\n  \"timestamp\": \"2026-04-09T12:00:00.000Z\",\n  \"level\": \"warn\",\n  \"session_id\": \"sess_abc123\",\n  \"tool\": \"mr_create\",\n  \"project\": \"my-team/platform/core\",\n  \"params\": {\"source_branch\": \"feature/x\", \"target_branch\": \"main\"},\n  \"result\": \"success\",\n  \"duration_ms\": 342\n}\n```\n\nУровни: `info` (read), `warn` (write), `error` (ошибки), `critical` (denied).\n\n## Разработка\n\n```bash\ngit clone git@gitlab.just-ai.com:secretary/ai-generated/gitlab-mcp-server.git\ncd gitlab-mcp-server\nnpm install\nnpm test          # 176 тестов\nnpm run lint      # TypeScript type check\nnpm run build     # Сборка в dist/\nnpm run dev       # Запуск в dev-режиме (tsx)\n```\n\n## Стек\n\n- TypeScript 5.x + Node.js 20+\n- [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) — MCP протокол\n- [@gitbeaker/rest](https://github.com/jdalrymple/gitbeaker) — GitLab API клиент\n- [casbin](https://casbin.org/) — Policy engine (RBAC + ABAC)\n- [vitest](https://vitest.dev/) — Тесты\n- [tsup](https://tsup.egoist.dev/) — Сборка\n\n## Лицензия\n\nMIT\n","readmeFilename":"README.md"}