{"id":31727214,"url":"https://github.com/vijay-duke/mcp-gitlab","last_synced_at":"2026-01-20T17:42:44.043Z","repository":{"id":308720243,"uuid":"1033833101","full_name":"Vijay-Duke/mcp-gitlab","owner":"Vijay-Duke","description":"MCP (Model Context Protocol) server for GitLab - AI-powered GitLab integration","archived":false,"fork":false,"pushed_at":"2025-09-29T00:06:01.000Z","size":496,"stargazers_count":0,"open_issues_count":3,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-29T02:26:42.108Z","etag":null,"topics":["ai","automation","devtools","gitlab","gitlab-api","mcp","model-context-protocol","python"],"latest_commit_sha":null,"homepage":"https://github.com/Vijay-Duke/mcp-gitlab","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Vijay-Duke.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":"audit_handlers.py","citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.md","dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-07T12:17:33.000Z","updated_at":"2025-08-25T00:15:42.000Z","dependencies_parsed_at":"2025-09-22T02:18:02.207Z","dependency_job_id":"8f68b2d8-4e31-4fdb-89f6-2df19d9ab221","html_url":"https://github.com/Vijay-Duke/mcp-gitlab","commit_stats":null,"previous_names":["vijay-duke/mcp-gitlab"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Vijay-Duke/mcp-gitlab","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vijay-Duke%2Fmcp-gitlab","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vijay-Duke%2Fmcp-gitlab/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vijay-Duke%2Fmcp-gitlab/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vijay-Duke%2Fmcp-gitlab/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Vijay-Duke","download_url":"https://codeload.github.com/Vijay-Duke/mcp-gitlab/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vijay-Duke%2Fmcp-gitlab/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279000850,"owners_count":26082950,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","automation","devtools","gitlab","gitlab-api","mcp","model-context-protocol","python"],"created_at":"2025-10-09T06:19:16.003Z","updated_at":"2026-01-20T17:42:44.032Z","avatar_url":"https://github.com/Vijay-Duke.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MCP GitLab Server\n\n[![CI](https://github.com/Vijay-Duke/mcp-gitlab/actions/workflows/ci.yml/badge.svg)](https://github.com/Vijay-Duke/mcp-gitlab/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/Vijay-Duke/mcp-gitlab/branch/main/graph/badge.svg)](https://codecov.io/gh/Vijay-Duke/mcp-gitlab)\n[![Documentation Status](https://readthedocs.org/projects/mcp-gitlab/badge/?version=latest)](https://mcp-gitlab.readthedocs.io/en/latest/?badge=latest)\n[![Python Version](https://img.shields.io/badge/python-3.10%2B-blue)](https://www.python.org/downloads/)\n[![License](https://img.shields.io/badge/license-Apache%202.0-green)](https://opensource.org/licenses/Apache-2.0)\n[![MCP](https://img.shields.io/badge/MCP-Compatible-purple)](https://github.com/anthropics/mcp)\n\nA Model Context Protocol (MCP) server that provides comprehensive GitLab API integration. This server enables LLMs to interact with GitLab repositories, manage merge requests, issues, and perform various Git operations.\n\n\u003ca href=\"https://glama.ai/mcp/servers/@Vijay-Duke/mcp-gitlab\"\u003e\n  \u003cimg width=\"380\" height=\"200\" src=\"https://glama.ai/mcp/servers/@Vijay-Duke/mcp-gitlab/badge\" alt=\"GitLab Server MCP server\" /\u003e\n\u003c/a\u003e\n\n## Features\n\n### Core Features\n- 🔐 **Authentication \u0026 Users** - Get current user info and lookup user profiles\n- 🔍 **Project Management** - List, search, and get details about GitLab projects\n- 📝 **Issues** - List, read, search, and comment on issues\n- 🔀 **Merge Requests** - List, read, update, approve, and merge MRs\n- 📁 **Repository Files** - Browse, read, and commit changes to files\n- 🌳 **Branches \u0026 Tags** - List and manage branches and tags\n- 🔧 **CI/CD Pipelines** - View pipeline status, jobs, and artifacts\n- 💬 **Discussions** - Read and resolve merge request discussions\n- 🎯 **Smart Operations** - Batch operations, AI summaries, and smart diffs\n\n### Advanced Features\n- **Batch Operations** - Execute multiple GitLab operations atomically with rollback support\n- **AI-Optimized Summaries** - Generate concise summaries of MRs, issues, and pipelines\n- **Smart Diffs** - Get structured diffs with configurable context and size limits\n- **Safe Preview** - Preview file changes before committing\n- **Cross-Reference Support** - Reference results from previous operations in batch mode\n\n## Installation\n\n### Using uvx (recommended - no installation needed)\n\n```bash\n# Run directly without installation\nuvx mcp-gitlab\n```\n\n### From source\n\n```bash\n# Clone the repository\ngit clone https://github.com/Vijay-Duke/mcp-gitlab.git\ncd mcp-gitlab\n\n# Install dependencies and run with uv\nuv sync\nuv run mcp-gitlab\n\n# Or install in development mode with test dependencies\nuv sync --all-extras\nuv run pytest  # to run tests\n```\n\n## Configuration\n\n### Environment Variables\n\nSet one of the following authentication tokens:\n\n```bash\n# Private token (recommended for personal use)\nexport GITLAB_PRIVATE_TOKEN=\"your-private-token\"\n\n# OAuth token\nexport GITLAB_OAUTH_TOKEN=\"your-oauth-token\"\n\n# GitLab URL (optional, defaults to https://gitlab.com)\nexport GITLAB_URL=\"https://gitlab.example.com\"\n```\n\n### Getting a GitLab Token\n\n1. Go to your GitLab profile settings\n2. Navigate to \"Access Tokens\"\n3. Create a new token with the following scopes:\n   - `api` - Full API access\n   - `read_repository` - Read repository content\n   - `write_repository` - Write repository content (for commits)\n\n## Usage\n\n### With Claude Desktop\n\nAdd to your Claude Desktop configuration:\n\n#### Using uvx (recommended - no installation needed):\n\n```json\n{\n  \"mcp-gitlab\": {\n    \"command\": \"uvx\",\n    \"args\": [\"mcp-gitlab\"],\n    \"env\": {\n      \"GITLAB_PRIVATE_TOKEN\": \"your-token-here\"\n    }\n  }\n}\n```\n\n#### Using uv (if you've cloned the repository):\n\n```json\n{\n  \"mcp-gitlab\": {\n    \"command\": \"uv\",\n    \"args\": [\"run\", \"mcp-gitlab\"],\n    \"cwd\": \"/path/to/mcp-gitlab\",\n    \"env\": {\n      \"GITLAB_PRIVATE_TOKEN\": \"your-token-here\"\n    }\n  }\n}\n```\n\nReplace `/path/to/mcp-gitlab` with the full path to where you cloned the repository.\n\n### Running with uvx\n\nThe easiest way to run the MCP GitLab server is using `uvx`:\n\n```bash\n# Set your GitLab token\nexport GITLAB_PRIVATE_TOKEN=\"your-token-here\"\n\n# Run the server directly with uvx\nuvx mcp-gitlab\n```\n\n### Standalone Usage\n\n```bash\n# If running from source (after uv sync)\nuv run mcp-gitlab\n\n# Or run the Python module directly\nuv run python -m mcp_gitlab\n```\n\n## Available Tools\n\n### Authentication \u0026 User Info\n\n#### `gitlab_get_current_user`\nGet the currently authenticated user's profile information.\n```json\n{}\n```\n\nReturns comprehensive information including:\n- Basic info: ID, username, name, email\n- Profile details: bio, organization, job title\n- Account status: state, creation date, admin status\n- Permissions: can_create_group, can_create_project\n- Security: two_factor_enabled, external status\n\n#### `gitlab_get_user`\nGet details for a specific user by ID or username.\n```json\n{\n  \"user_id\": 12345\n}\n```\nor\n```json\n{\n  \"username\": \"johndoe\"\n}\n```\n\nReturns user information including:\n- Basic info: ID, username, name\n- Profile: avatar_url, web_url, bio\n- Organization details: company, job title\n- Account status and creation date\n\n### Project Management\n\n#### `gitlab_list_projects`\nList accessible GitLab projects with pagination and search.\n```json\n{\n  \"owned\": false,\n  \"search\": \"my-project\",\n  \"per_page\": 20,\n  \"page\": 1\n}\n```\n\n#### `gitlab_get_project`\nGet detailed information about a specific project.\n```json\n{\n  \"project_id\": \"group/project\"\n}\n```\n\n#### `gitlab_get_current_project`\nGet the GitLab project information from the current git repository.\n```json\n{\n  \"path\": \".\"\n}\n```\n\n### Issues\n\n#### `gitlab_list_issues`\nList project issues with state filtering.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"state\": \"opened\",\n  \"per_page\": 20\n}\n```\n\n#### `gitlab_get_issue`\nGet a single issue with full details.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"issue_iid\": 123\n}\n```\n\n#### `gitlab_add_issue_comment`\nAdd a comment to an issue.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"issue_iid\": 123,\n  \"body\": \"Thanks for reporting this!\"\n}\n```\n\n### Merge Requests\n\n#### `gitlab_list_merge_requests`\nList merge requests with filtering options.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"state\": \"opened\"\n}\n```\n\n#### `gitlab_get_merge_request`\nGet detailed merge request information.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"mr_iid\": 456\n}\n```\n\n#### `gitlab_update_merge_request`\nUpdate merge request fields.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"mr_iid\": 456,\n  \"title\": \"Updated title\",\n  \"description\": \"New description\",\n  \"labels\": \"bug,priority\"\n}\n```\n\n#### `gitlab_merge_merge_request`\nMerge a merge request with options.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"mr_iid\": 456,\n  \"squash\": true,\n  \"should_remove_source_branch\": true\n}\n```\n\n#### `gitlab_approve_merge_request`\nApprove a merge request.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"mr_iid\": 456\n}\n```\n\n### Repository Operations\n\n#### `gitlab_get_file_content`\nRead file content from the repository.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"file_path\": \"src/main.py\",\n  \"ref\": \"main\"\n}\n```\n\n#### `gitlab_create_commit`\nCreate a commit with multiple file changes.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"branch\": \"feature-branch\",\n  \"commit_message\": \"Add new features\",\n  \"actions\": [\n    {\n      \"action\": \"create\",\n      \"file_path\": \"new_file.py\",\n      \"content\": \"print('Hello')\"\n    },\n    {\n      \"action\": \"update\",\n      \"file_path\": \"existing.py\",\n      \"content\": \"# Updated content\"\n    }\n  ]\n}\n```\n\n#### `gitlab_compare_refs`\nCompare two branches, tags, or commits.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"from_ref\": \"main\",\n  \"to_ref\": \"feature-branch\"\n}\n```\n\n### CI/CD Jobs and Artifacts\n\n#### `gitlab_list_pipeline_jobs`\nList jobs in a specific CI/CD pipeline.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"pipeline_id\": 789,\n  \"per_page\": 20,\n  \"page\": 1\n}\n```\n\n#### `gitlab_list_project_jobs`\nList jobs for a project with optional scope filtering.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"scope\": \"failed\",\n  \"per_page\": 25\n}\n```\n\n#### `gitlab_download_job_artifact`\nGet information about job artifacts (security note: content not downloaded).\n```json\n{\n  \"project_id\": \"group/project\",\n  \"job_id\": 456,\n  \"artifact_path\": \"build.zip\"\n}\n```\n\n### Advanced Tools\n\n#### `gitlab_batch_operations`\nExecute multiple operations atomically with rollback support.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"operations\": [\n    {\n      \"name\": \"get_issue\",\n      \"tool\": \"gitlab_get_issue\",\n      \"arguments\": {\"issue_iid\": 123}\n    },\n    {\n      \"name\": \"create_mr\",\n      \"tool\": \"gitlab_create_merge_request\",\n      \"arguments\": {\n        \"source_branch\": \"fix-{{get_issue.iid}}\",\n        \"target_branch\": \"main\",\n        \"title\": \"Fix: {{get_issue.title}}\"\n      }\n    }\n  ]\n}\n```\n\n#### `gitlab_summarize_merge_request`\nGenerate an AI-friendly summary of a merge request.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"mr_iid\": 456,\n  \"max_length\": 500\n}\n```\n\n#### `gitlab_smart_diff`\nGet a structured diff with context and size limits.\n```json\n{\n  \"project_id\": \"group/project\",\n  \"from_ref\": \"main\",\n  \"to_ref\": \"feature\",\n  \"context_lines\": 3,\n  \"max_file_size\": 50000\n}\n```\n\n### User \u0026 Profile Management\n\n#### `gitlab_search_user`\nSearch for GitLab users by name, username, or email.\n```json\n{\n  \"search\": \"John\",\n  \"per_page\": 10\n}\n```\n\n#### `gitlab_get_user_details`  \nGet comprehensive user profile and metadata.\n```json\n{\n  \"username\": \"johndoe\"\n}\n```\n\n#### `gitlab_get_my_profile`\nGet the current authenticated user's complete profile.\n```json\n{}\n```\n\n#### `gitlab_get_user_contributions_summary`\nSummarize user's recent contributions across issues, MRs, and commits.\n```json\n{\n  \"username\": \"johndoe\",\n  \"since\": \"2024-01-01\",\n  \"until\": \"2024-01-31\"\n}\n```\n\n#### `gitlab_get_user_activity_feed`\nRetrieve user's complete activity/events timeline.\n```json\n{\n  \"username\": \"johndoe\", \n  \"target_type\": \"Issue\",\n  \"after\": \"2024-01-01\"\n}\n```\n\n### User's Issues \u0026 Merge Requests\n\n#### `gitlab_get_user_open_mrs`\nGet all open merge requests authored by a user.\n```json\n{\n  \"username\": \"johndoe\",\n  \"sort\": \"updated\"\n}\n```\n\n#### `gitlab_get_user_review_requests`\nGet MRs where user is assigned as reviewer with pending action.\n```json\n{\n  \"username\": \"johndoe\",\n  \"priority\": \"high\",\n  \"sort\": \"urgency\"\n}\n```\n\n#### `gitlab_get_user_open_issues`\nGet open issues assigned to a user, prioritized by severity/SLA.\n```json\n{\n  \"username\": \"johndoe\",\n  \"sla_status\": \"overdue\",\n  \"sort\": \"priority\"\n}\n```\n\n#### `gitlab_get_user_reported_issues`\nGet issues reported/created by a user.\n```json\n{\n  \"username\": \"johndoe\",\n  \"state\": \"opened\",\n  \"since\": \"2024-01-01\"\n}\n```\n\n#### `gitlab_get_user_resolved_issues`\nGet issues closed/resolved by a user.\n```json\n{\n  \"username\": \"johndoe\",\n  \"since\": \"2024-01-01\",\n  \"until\": \"2024-03-31\"\n}\n```\n\n### User's Code \u0026 Commits\n\n#### `gitlab_get_user_commits`\nGet commits authored by a user within date range or branch.\n```json\n{\n  \"username\": \"johndoe\", \n  \"branch\": \"main\",\n  \"since\": \"2024-01-01\",\n  \"include_stats\": true\n}\n```\n\n### Complete Tool List\n\n- **Projects**: `gitlab_list_projects`, `gitlab_get_project`, `gitlab_get_current_project`, `gitlab_search_projects`\n- **Issues**: `gitlab_list_issues`, `gitlab_get_issue`, `gitlab_add_issue_comment`, `gitlab_summarize_issue`\n- **Merge Requests**: `gitlab_list_merge_requests`, `gitlab_get_merge_request`, `gitlab_update_merge_request`, `gitlab_close_merge_request`, `gitlab_merge_merge_request`, `gitlab_add_merge_request_comment`, `gitlab_get_merge_request_notes`, `gitlab_approve_merge_request`, `gitlab_get_merge_request_approvals`, `gitlab_get_merge_request_discussions`, `gitlab_resolve_discussion`, `gitlab_get_merge_request_changes`, `gitlab_rebase_merge_request`\n- **Repository**: `gitlab_get_file_content`, `gitlab_list_repository_tree`, `gitlab_list_commits`, `gitlab_get_commit`, `gitlab_get_commit_diff`, `gitlab_create_commit`, `gitlab_cherry_pick_commit`, `gitlab_compare_refs`, `gitlab_list_tags`\n- **Branches**: `gitlab_list_branches`\n- **Pipelines \u0026 Jobs**: `gitlab_list_pipelines`, `gitlab_list_pipeline_jobs`, `gitlab_list_project_jobs`, `gitlab_download_job_artifact`, `gitlab_summarize_pipeline`\n- **Search**: `gitlab_search_projects`, `gitlab_search_in_project`\n- **Users**: `gitlab_get_current_user`, `gitlab_get_user`, `gitlab_list_user_events`, `gitlab_list_project_members`\n- **User \u0026 Profile**: `gitlab_search_user`, `gitlab_get_user_details`, `gitlab_get_my_profile`, `gitlab_get_user_contributions_summary`, `gitlab_get_user_activity_feed`\n- **User's Issues \u0026 MRs**: `gitlab_get_user_open_mrs`, `gitlab_get_user_review_requests`, `gitlab_get_user_open_issues`, `gitlab_get_user_reported_issues`, `gitlab_get_user_resolved_issues`\n- **User's Code \u0026 Commits**: `gitlab_get_user_commits`\n- **Releases**: `gitlab_list_releases`\n- **Webhooks**: `gitlab_list_project_hooks`\n- **AI Tools**: `gitlab_summarize_merge_request`, `gitlab_summarize_issue`, `gitlab_summarize_pipeline`\n- **Advanced**: `gitlab_batch_operations`, `gitlab_smart_diff`, `gitlab_safe_preview_commit`\n\n## Examples\n\n### Auto-detect and List Issues\n```python\n# First get current project from git repo\nproject = await session.call_tool(\"gitlab_get_current_project\")\n\n# Then list open issues\nissues = await session.call_tool(\"gitlab_list_issues\", {\n    \"state\": \"opened\"\n})\n```\n\n### Create a Fix with Batch Operations\n```python\n# Atomically: get issue → create branch → commit fix → create MR\nresult = await session.call_tool(\"gitlab_batch_operations\", {\n    \"operations\": [\n        {\n            \"name\": \"issue\",\n            \"tool\": \"gitlab_get_issue\", \n            \"arguments\": {\"issue_iid\": 123}\n        },\n        {\n            \"name\": \"fix\",\n            \"tool\": \"gitlab_create_commit\",\n            \"arguments\": {\n                \"branch\": \"fix-issue-{{issue.iid}}\",\n                \"commit_message\": \"Fix: {{issue.title}}\",\n                \"actions\": [{\n                    \"action\": \"update\",\n                    \"file_path\": \"src/bug.py\",\n                    \"content\": \"# Fixed code here\"\n                }]\n            }\n        },\n        {\n            \"name\": \"mr\",\n            \"tool\": \"gitlab_create_merge_request\",\n            \"arguments\": {\n                \"source_branch\": \"fix-issue-{{issue.iid}}\",\n                \"target_branch\": \"main\",\n                \"title\": \"Fix: {{issue.title}}\",\n                \"description\": \"Fixes #{{issue.iid}}\"\n            }\n        }\n    ]\n})\n```\n\n## Development\n\n### Quick Start\n\n```bash\n# Install development dependencies\nmake install-dev\n\n# Run all checks locally\nmake ci-local\n\n# Format code\nmake format\n\n# Run tests with coverage\nmake test-cov\n```\n\n### CI/CD Pipeline\n\nThis project uses GitHub Actions for continuous integration and deployment:\n\n- **CI Pipeline**: Runs on every push and PR\n  - Linting (Ruff, Black, isort, MyPy)\n  - Testing (pytest with coverage)\n  - Security scanning (Bandit, Safety, pip-audit)\n  - Multi-version Python testing (3.10, 3.11, 3.12)\n  \n- **Code Quality**: \n  - SonarCloud analysis\n  - CodeQL security analysis\n  - Complexity metrics (Radon, Xenon)\n  \n- **Release Pipeline**: Automated releases on version tags\n  - PyPI package publishing\n  - Docker image building and publishing\n  - GitHub release creation\n\n### Running Tests\n\n```bash\n# Run all tests\nuv run pytest tests/ -v\n\n# Run with coverage\nuv run pytest tests/ --cov=mcp_gitlab\n\n# Run specific test file\nuv run pytest tests/test_gitlab_client.py -v\n```\n\n### Code Style\n\nThe project uses:\n- Black for code formatting\n- isort for import sorting\n- flake8 for linting\n- mypy for type checking\n\n```bash\n# Format code\nblack src/ tests/\nisort src/ tests/\n\n# Run linters\nflake8 src/ tests/\nmypy src/\n```\n\n## Troubleshooting\n\n### Authentication Issues\n- Ensure your token has the required scopes (`api`, `read_repository`, `write_repository`)\n- Check token expiration date\n- Verify GitLab URL if using self-hosted instance\n\n### Rate Limiting\nGitLab API has rate limits. The server handles rate limit errors gracefully and returns appropriate error messages.\n\n### Large Responses\nResponses are automatically truncated if they exceed size limits. Use pagination parameters to retrieve data in chunks.\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n## License\n\nThis project is licensed under the Apache License 2.0 - see the [LICENSE](LICENSE) file for details.\n\n## Acknowledgments\n\n- Built on the [Model Context Protocol](https://github.com/anthropics/mcp)\n- Uses [python-gitlab](https://github.com/python-gitlab/python-gitlab) for GitLab API interaction\n- Inspired by the need for better LLM-GitLab integration","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvijay-duke%2Fmcp-gitlab","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvijay-duke%2Fmcp-gitlab","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvijay-duke%2Fmcp-gitlab/lists"}