cd /news/ai-agents/how-i-shipped-15-green-mrs-to-gitlab… Β· home β€Ί topics β€Ί ai-agents β€Ί article
[ARTICLE Β· art-157352] src=dev.to β†— pub= topic=ai-agents verified=true sentiment=↑ positive

How I Shipped 15 Green MRs to GitLab in One Day: Inside Our Modern Contributor Tech Stack

An engineering team shipped 15 fully green merge requests across three upstream GitLab repositories in a single day, reaching 4,197 contributor points toward GitLab's Level 4 milestone of 7,500. The work spanned Ruby, TypeScript, and Python and centered on GitLab Core's native Model Context Protocol support in Rails, including nine MCP tool endpoints such as list_pipeline_schedules, create_merge_request_pipeline, and save_work_item with optimistic locking and targeted description edits.

by read3 min views1 publishedOct 25, 2026

Contributing to one of the largest open-source platforms in the world is usually described as slow, deliberate, and fraught with complex CI pipelines.

Today, across three distinct upstream GitLab repositories, our engineering pipeline achieved a landmark milestone: 15 out of 15 Merge Requests 100% Green in CI, 100% assigned to maintainers and domain reviewers, and officially crossing 4,197 live contributor points on track to the prestigious Level 4 Contributor milestone (7,500 pts).

How do you tackle 15 upstream issues across Ruby, TypeScript, and Python in a single sprint without breaking pipelines or getting bogged down in review cycles?

Here is an architectural breakdown of the modern tech stack we use every day to solve GitLab issues at enterprise velocity.

GitLab is no longer just a monolithic Ruby on Rails application. Modern AI-assisted software delivery requires a distributed ecosystem:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        Developer / Agentic Client                      β”‚
β”‚                  (Claude Desktop, Cline, Cursor, Antigravity)          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚ Model Context Protocol (JSON-RPC)
                                    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   GitLab Core MCP Server (Ruby on Rails)               β”‚
β”‚                  lib/api/mcp/handlers & JSON-RPC Router                β”‚
β”‚                                                                        β”‚
β”‚   β€’ list_pipeline_schedules   β€’ create_merge_request_pipeline          β”‚
β”‚   β€’ list_work_items (filter)  β€’ save_work_item (description_edits)     β”‚
β”‚   β€’ list_user_events          β€’ get_pipeline (poll hints)              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                    β”‚                                β”‚
                    β–Ό                                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  GitLab LSP (TypeScript / Node.js)   β”‚  β”‚  AI Gateway (Python / FastAPIβ”‚
β”‚  editor-extensions/gitlab-lsp        β”‚  β”‚  modelops/.../ai-assist      β”‚
β”‚                                      β”‚  β”‚                              β”‚
β”‚   β€’ Virtual Workspace File Indexing  β”‚  β”‚   β€’ Agent Platform Guard     β”‚
β”‚   β€’ WebSocket Lifecycle & Leak Fix   β”‚  β”‚   β€’ Duo Workflow Service     β”‚
β”‚   β€’ Multibyte UTF-8 Chunk Decoder    β”‚  β”‚   β€’ APIStatusError Handling  β”‚
β”‚   β€’ CLI Slash Command Wake Queue     β”‚  β”‚   β€’ Tool Execution Loop      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

GitLab Core is pioneering native support for Anthropic's Model Context Protocol (MCP) directly within its Rails application (lib/api/mcp/). This allows AI agents to interface directly with GitLab issues, pipelines, notes, and work items via structured JSON-RPC.

rspec:predictive) We implemented and polished 9 distinct MCP tool endpoints:

list_pipeline_schedules``!264856): Exposing CI schedule discovery to AI agents. create_merge_request_pipeline``!264858): Giving agents the ability to trigger targeted MR pipeline runs.save_work_item with description_edits & expected_updated_at``!264862): Adding optimistic locking and targeted string replacement diffs to prevent concurrent edit collisions.list_work_items with parent_id hierarchy filter!264859): Allowing recursive task tree traversal. get_pipeline with poll_after_seconds hint!264863): Teaching AI agents how long to sleep before polling pipeline status.list_user_events``!264864): Activity feed telemetry tool for AI agents.!264852): Transparently accepting query and search_term.!264853): Reporting unknown parameter names with suggestions. save_note updating!264854): Allowing AI agents to update existing issue notes. In GitLab Rails helpers, never declare unmemoized instance variables (@variable). RuboCop will flag this under Gitlab/PredicateMemoization or helper encapsulation rules. Clean encapsulation in service classes keeps CI 100% green on the first push!

The gitlab-lsp powers language intelligence and Duo AI features inside VS Code, WebIDE, and JetBrains.

ws)!4537, #3364) NodeJS.Timeout) was not cleared. Over time, reconnect attempts created zombie timers that leaked memory.

   // Explicit cleanup on upgrade rejection
   this.ws.on('unexpected-response', (_req, res) => {
     this.clearHeartbeat();
     this.emit('error', new UpgradeError(res.statusCode));
   });

!4538, #3350) StringDecoder('utf8') guarantees chunk boundary safety.!4536, #2381) The ai-assist repository runs the GitLab AI Gatewayβ€”the engine orchestrating large language models and multi-agent execution loops.

!7641, #3394)!7642, #3345) status_code from client APIStatusError exceptions rather than letting unhandled errors cascade into generic HTTP 500 crashes.

Metric Standing Impact
Current Live Score 4,197 points Verified Level 3 Contributor
Points Added Today +327 points Verified through Contributor API
Active Merge Requests 15 MRs 9 in Core, 4 in LSP, 2 in AI Gateway
CI Success Rate 15 / 15 (100% Green) Zero test failures
Reviewer Coverage 15 / 15 Assigned Zero unassigned MRs
Unresolved Threads 0 Blockers Sub-30-minute review SLA readiness
Projected Total Upon Merge 7,545+ points Surpasses Level 4 Target (7,500 pts)

Follow our daily engineering journey across GitHub (@hrlpavan) and GitLab (@hrlpavan).

── more in #ai-agents 4 stories Β· sorted by recency
── more on @gitlab 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/how-i-shipped-15-gre…] indexed:0 read:3min 2026-10-25 Β· β€”