This is a Gitlab MCP Server specifically for Agents (eg: Pydantic AI). This was developed due to incompatibility of the various other gitlab mcp servers , including the official one with pydantic & llms like google-gemini. This is a wrapper around gitlab-mcp & provides access to all of the tools present (62 !)
- Compatible: Compatible with the latest frameworks & tools like pydantic , google-gemini .
- Extensive Toolset: Access a wide range of tools for CRUD operations on Merge requests, files, repositories, branches, notes, issues, namespaces, projects ,labels, commits, events.
- Validation: Improved validation for Tool inputs, properties & JSON schemas.
- Connection: Supports both stdio and streamable HTTPS for flexible and reliable agent communication.
.
├── server.py # wrapper class around @zereight/mcp-gitlab to manage it's runtime, async context, list & call tools.
├── server2.py # low level mcp server re-packaging the modified tools.
├── requirements.txt # Python package requirements
├── utils.py # Code for replacing references in the json tool input schema with the actual attributes.
├── utils2.py # Code for further modifying the tool input schema (remove nested dicts, arrays, other not supported keys).
├── app.py # Example code for how to run the mcp server with a pydantic ai agent.
└── README.md # This file
-
Clone the repository:
git clone https://github.com/eshan1347/gitlab-agent-mcp.git cd gitlab-agent-mcp -
Install requirements :
pip install -r requirements.txt
-
Set up your environment by creating a
.envfile or exporting the variables directly in your terminal. -
Run the mcp server :
STDIO :-
server = pydantic_ai.mcp.MCPServerStdio( command='python', args=[ 'server2_stdio.py' ], env={ 'GITLAB_ACCESS_TOKEN': "your_gitlab_token", 'GITLAB_PROJECT_ID': "your_project_id" //Optional } )
Streamable HTTP :-
python ./server2_http
GITLAB_PERSONAL_ACCESS_TOKEN: Your GitLab personal access token.GITLAB_API_URL: Your GitLab API URL. (Default: https://gitlab.com/api/v4)GITLAB_PROJECT_ID: Default project ID. If set, Overwrite this value when making an API request.GITLAB_ALLOWED_PROJECT_IDS: Optional comma-separated list of allowed project IDs. When set with a single value, acts as a default project (like the old "lock" mode). When set with multiple values, restricts access to only those projects.Singlevalue 123: MCP server can only access project 123 and uses it as defaultMultiplevalues 123,456,789: MCP server can access projects 123, 456, and 789 but requires explicit project ID in requestsGITLAB_READ_ONLY_MODE: When set to 'true', restricts the server to only expose read-only operations. Useful for enhanced security or when write access is not needed. Also useful for using with Cursor and it's 40 tool limit.GITLAB_DENIED_TOOLS_REGEX: When set as a regular expression, it excludes the matching tools.USE_GITLAB_WIKI: When set to 'true', enables the wiki-related tools (list_wiki_pages, get_wiki_page, create_wiki_page, update_wiki_page, delete_wiki_page). By default, wiki features are disabled.USE_MILESTONE: When set to 'true', enables the milestone-related tools (list_milestones, get_milestone, create_milestone, edit_milestone, delete_milestone, get_milestone_issue, get_milestone_merge_requests, promote_milestone, get_milestone_burndown_events). By default, milestone features are disabled.USE_PIPELINE: When set to 'true', enables the pipeline-related tools (list_pipelines, get_pipeline, list_pipeline_jobs, list_pipeline_trigger_jobs, get_pipeline_job, get_pipeline_job_output, create_pipeline, retry_pipeline, cancel_pipeline, play_pipeline_job, retry_pipeline_job, cancel_pipeline_job). By default, pipeline features are disabled.GITLAB_AUTH_COOKIE_PATH: Path to an authentication cookie file for GitLab instances that require cookie-based authentication. When provided, the cookie will be included in all GitLab API requests.GITLAB_COMMIT_FILES_PER_PAGE: The number of files per page that GitLab returns for commit diffs. This value should match the server-side GitLab setting. Adjust this if your GitLab instance uses a custom per-page value for commit diffs.
merge_merge_request- Merge a merge request in a GitLab projectcreate_or_update_file- Create or update a single file in a GitLab projectsearch_repositories- Search for GitLab projectscreate_repository- Create a new GitLab projectget_file_contents- Get the contents of a file or directory from a GitLab projectpush_files- Push multiple files to a GitLab project in a single commitcreate_issue- Create a new issue in a GitLab projectcreate_merge_request- Create a new merge request in a GitLab projectfork_repository- Fork a GitLab project to your account or specified namespacecreate_branch- Create a new branch in a GitLab projectget_merge_request- Get details of a merge request (Either mergeRequestIid or branchName must be provided)get_merge_request_diffs- Get the changes/diffs of a merge request (Either mergeRequestIid or branchName must be provided)list_merge_request_diffs- List merge request diffs with pagination support (Either mergeRequestIid or branchName must be provided)get_branch_diffs- Get the changes/diffs between two branches or commits in a GitLab projectupdate_merge_request- Update a merge request (Either mergeRequestIid or branchName must be provided)create_note- Create a new note (comment) to an issue or merge requestcreate_merge_request_thread- Create a new thread on a merge requestmr_discussions- List discussion items for a merge requestupdate_merge_request_note- Modify an existing merge request thread notecreate_merge_request_note- Add a new note to an existing merge request threadget_draft_note- Get a single draft note from a merge requestlist_draft_notes- List draft notes for a merge requestcreate_draft_note- Create a draft note for a merge requestupdate_draft_note- Update an existing draft notedelete_draft_note- Delete a draft notepublish_draft_note- Publish a single draft notebulk_publish_draft_notes- Publish all draft notes for a merge requestupdate_issue_note- Modify an existing issue thread notecreate_issue_note- Add a new note to an existing issue threadlist_issues- List issues (default: created by current user only; use scope='all' for all accessible issues)my_issues- List issues assigned to the authenticated user (defaults to open issues)get_issue- Get details of a specific issue in a GitLab projectupdate_issue- Update an issue in a GitLab projectdelete_issue- Delete an issue from a GitLab projectlist_issue_links- List all issue links for a specific issuelist_issue_discussions- List discussions for an issue in a GitLab projectget_issue_link- Get a specific issue linkcreate_issue_link- Create an issue link between two issuesdelete_issue_link- Delete an issue linklist_namespaces- List all namespaces available to the current userget_namespace- Get details of a namespace by ID or pathverify_namespace- Verify if a namespace path existsget_project- Get details of a specific projectlist_projects- List projects accessible by the current userlist_project_members- List members of a GitLab projectlist_labels- List labels for a projectget_label- Get a single label from a projectcreate_label- Create a new label in a projectupdate_label- Update an existing label in a projectdelete_label- Delete a label from a projectlist_group_projects- List projects in a GitLab group with filtering optionslist_wiki_pages- List wiki pages in a GitLab projectget_wiki_page- Get details of a specific wiki pagecreate_wiki_page- Create a new wiki page in a GitLab projectupdate_wiki_page- Update an existing wiki page in a GitLab projectdelete_wiki_page- Delete a wiki page from a GitLab projectget_repository_tree- Get the repository tree for a GitLab project (list files and directories)list_pipelines- List pipelines in a GitLab project with filtering optionsget_pipeline- Get details of a specific pipeline in a GitLab projectlist_pipeline_jobs- List all jobs in a specific pipelinelist_pipeline_trigger_jobs- List all trigger jobs (bridges) in a specific pipeline that trigger downstream pipelinesget_pipeline_job- Get details of a GitLab pipeline job numberget_pipeline_job_output- Get the output/trace of a GitLab pipeline job with optional pagination to limit context window usagecreate_pipeline- Create a new pipeline for a branch or tagretry_pipeline- Retry a failed or canceled pipelinecancel_pipeline- Cancel a running pipelineplay_pipeline_job- Run a manual pipeline jobretry_pipeline_job- Retry a failed or canceled pipeline jobcancel_pipeline_job- Cancel a running pipeline joblist_merge_requests- List merge requests in a GitLab project with filtering optionslist_milestones- List milestones in a GitLab project with filtering optionsget_milestone- Get details of a specific milestonecreate_milestone- Create a new milestone in a GitLab projectedit_milestone- Edit an existing milestone in a GitLab projectdelete_milestone- Delete a milestone from a GitLab projectget_milestone_issue- Get issues associated with a specific milestoneget_milestone_merge_requests- Get merge requests associated with a specific milestonepromote_milestone- Promote a milestone to the next stageget_milestone_burndown_events- Get burndown events for a specific milestoneget_users- Get GitLab user details by usernameslist_commits- List repository commits with filtering optionsget_commit- Get details of a specific commitget_commit_diff- Get changes/diffs of a specific commitlist_group_iterations- List group iterations with filtering optionsupload_markdown- Upload a file to a GitLab project for use in markdown contentdownload_attachment- Download an uploaded file from a GitLab project by secret and filenamelist_events- List all events for the currently authenticated userget_project_events- List all visible events for a specified project