GitLab merge request governance agent that evaluates MRs against a compliance rubric using Gemini 2.5 Flash via Google ADK and GitLab MCP server, posting structured compliance verdicts and remediation guidance as comments.
MR Sentinel demonstrates solid tool design with consistent naming (verb_noun pattern), comprehensive parameter descriptions, and clear input schemas across all 15 tools. All tools follow GitLab domain conventions (project_path, mr_iid, pipeline_id). However, output schemas are not explicitly documented in the source code, only inferred from GitLab API responses. Error handling is minimal; tools lack recovery guidance and actionable error messages. Tool descriptions average ~120 chars (within baseline 194), but lack dependency hints and prerequisites. The record_verdict tool is well-structured with enum constraints, but most tools omit idempotency and confirmation patterns for write operations.
Add labels to a merge request (additive — existing labels stay). Returns the new label list.
Open a new issue in a project. Returns the created issue payload including iid, web_url, and other metadata.
Return the note_id of the prior agent comment (identified by marker), or None if not found.
Fetch the raw content of a file from a repository at the default branch. Returns None if file does not exist.
Return the most-recent pipeline run against a given commit SHA, or None if no pipeline exists.
Fetch a merge request by project path and MR IID. Returns MR metadata including title, description, author, branches, state, web URL, commit SHA, and labels.
Output schemas not documented in source code. Tool descriptions state what is returned (e.g., 'Returns MR metadata including title, description, author...') but formal JSON Schema output definitions are absent. LLMs cannot plan downstream tool calls without knowing response structure.
Write operations (post_merge_request_comment, update_merge_request_note, add_merge_request_labels, create_issue) lack confirmation or dry-run patterns. No idempotency hints. Agents cannot safely retry on ambiguous failures without risking duplicate comments or labels.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Fetch the diff entries for a merge request. Returns a list of file changes with old/new paths, modes, and unified diff content.
List all notes/comments on a merge request. Used to find the agent's prior comment. Returns up to 100 notes.
List all CI/CD pipelines for a merge request. Returns pipeline metadata including status, ID, and timestamps.
List all jobs in a CI/CD pipeline. Returns job metadata including name, status, stage, and artifacts.
List vulnerability findings (security advisories) for a project. Returns empty list on Free tier. Gracefully handles missing data.
Post a note (comment) on a merge request. Returns the note ID of the created comment.
Record the final MR evaluation. Call once, last, after applying the rubric. Structured tool for ADK agent to emit compliance verdict.
Edit an existing note/comment on a merge request. Returns the note ID (unchanged on success).
Post a comment if none exists with the marker, otherwise update the existing one. Returns (note_id, created) where created=True means new note, False means edited.
Error handling is minimal. No recovery guidance in tool descriptions. Tools state 'Returns None if file does not exist' or 'Gracefully handles missing data' but do not guide the LLM on what to do next (e.g., 'Try searching for the file with list_files()' or 'Check project permissions').
Dependency hints missing. Tools like upsert_merge_request_comment reference a 'marker' parameter with a default, but do not explain when to use custom markers or how they interact with find_agent_note. Multi-step workflows are not documented.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are not present in the MCP schema. Risk levels are documented in the evaluation (READ_ONLY vs WRITE) but not exposed to the MCP client via tool metadata.