Changes in v2.3.10
🔒 Security
- GHSA-2p72-j379-vmm3 — two fixes:
- Session owner binding with
REMOTE_AUTHORIZATION=true: a stateful session now belongs to the GitLab user whose token opened it (or, for an unauthenticated tool-discovery session, the first user who authenticates on it). A request with another user'sPrivate-Token,JOB-TOKEN, orAuthorizationtoken gets404 Session not foundand can no longer replace the session's stored token.GET/DELETE /mcpfor such a session now need a token of its user (401without one). A new token of the same user, including a CI job token of one of the user's jobs, still works. download_job_artifactsconfined toGITLAB_DOWNLOAD_DIR: in stdio modeartifacts_job_<id>.zipis now saved underGITLAB_DOWNLOAD_DIR(default.gitlab-mcp-downloads) instead of the working directory,local_pathis relative to that directory, an existing file is no longer overwritten, and an interrupted download leaves no partial file — matchingdownload_attachment.
- Session owner binding with
- Header-authenticated
/downloads/*project scope: withREMOTE_AUTHORIZATION=trueandENABLE_DYNAMIC_PROJECT_SCOPE=true, a/downloads/*request authenticated byPrivate-Token,JOB-TOKEN, orAuthorization(instead of a download token) ignored its ownX-GitLab-Allowed-Project-Idsheader. It is now enforced like on/mcp: an empty value or one naming a project outsideGITLAB_ALLOWED_PROJECT_IDS→401, a project outside the header scope →403. Without the header, onlyGITLAB_ALLOWED_PROJECT_IDSapplies.
Upgrade to v2.3.10 if you run the server in remote mode (REMOTE_AUTHORIZATION=true) or use download_job_artifacts.
⚠️ Breaking changes
download_job_artifacts(stdio) writes toGITLAB_DOWNLOAD_DIRinstead of the working directory and refuses to replace an existing archive.
🐛 Bug Fixes
- fix: bind remote-auth sessions to their user and enforce download scope #923
Contributors
⚠️ Deprecation notice
Deprecated configuration options (e.g. GITLAB_READ_ONLY_MODE, USE_GITLAB_WIKI, and other legacy flags) still work during the grace period, but they will be removed in v3.0.0. Please migrate to the replacements described in the pinned issue #815.