Planning that spans repositories tends to live on group milestones, and here list_group_milestones, create_group_milestone, update_group_milestone and delete_group_milestone sit beside the project equivalents instead of being absent; list_group_milestones also filters by containing_date, include_ancestors and include_descendants, which is what makes a roadmap query answerable in a call. Beyond that it is a working issue-and-merge-request client with the write side intact — files, branches, forks, labels and merges. One behaviour worth knowing before you filter: list_issues is documented to fetch every page automatically unless you ask for a specific one, so a broad filter returns the whole set rather than the first screen of it.
A GitLab client of 30 tools covering project and group search, file writes, branches, issues, merge requests, labels, and milestones at both project and group level.
- File writes with the commit shaped for you: create_or_update_file writes a single file with its commit_message and carries previous_path when the file is being renamed, push_files commits a set of files as one commit, get_file_contents reads a file or directory at a ref, and create_branch branches from any ref.
- Project-level operations: search_repositories and search_groups page through what the token can reach, search_groups narrowing by min_access_level and owned; create_repository sets visibility and can initialize_with_readme; fork_repository targets your account or a named namespace.
- Issues from creation to close: create_issue takes assignee_ids, labels and milestone_id; list_issues filters by author_id, assignee_id, labels, milestone, state and created or updated windows, and fetches across all pages unless a page is named; search_issues narrows by text; update_issue carries a state_event; add_issue_comment posts to the thread.
- Merge requests: create_merge_request takes source_branch, target_branch, draft and allow_collaboration; list_merge_requests filters the same way issues do and adds source_branch and target_branch; update_merge_request can retarget or remove_source_branch; add_merge_request_comment posts to it; merge_merge_request can wait on merge_when_pipeline_succeeds, pin a sha, set the merge_commit_message and drop the source branch.
- Labels as a managed set: list_labels, create_label with a color and priority, update_label which can rename through new_name, and delete_label.
- Milestones at both levels: create_milestone, update_milestone, delete_milestone and list_milestones for a project, and create_group_milestone, update_group_milestone, delete_group_milestone and list_group_milestones for a group, the group listing filtering by containing_date, include_ancestors, include_descendants, updated_after and updated_before.
A GitLab personal access token in GITLAB_PERSONAL_ACCESS_TOKEN, and the API base URL of the instance it should talk to in GITLAB_API_URL.
One command plus a key — npx @therealchristhomas/gitlab-mcp-server, then supply credentials
