go-gerrit-mcp
Exposes Gerrit code review operations as MCP tools, allowing AI agents to search and read changes, publish review comments, set votes, and drive change-state transitions (submit, abandon, restore, wip, ready) on a Gerrit instance.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@go-gerrit-mcpShow open changes in the core project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
go-gerrit-mcp
An MCP (Model Context Protocol) server that exposes Gerrit code review operations as capability-gated tools. An AI agent can search and read changes, publish review comments, vote, and drive change-state transitions. Every write capability is an explicit operator opt-in.
Transport: stdio
Target platform: Gerrit 3.13+, authenticated via HTTP credentials
Output: llmxml, semantically tagged text meant to be read by a model (see Output format)
Safety posture
Two defaults encode it:
Zero configuration exposes the
readgroup only. Write capability never appears unless enabled via--groups.The own-changes restriction is on by default. Even with write groups enabled, trail-leaving operations (comments, votes, state changes, anything other humans see) are refused on changes the authenticated account does not own, until the operator explicitly passes
--own-changes-only=false.
An agent leaving unwanted trail on colleagues' changes is an externally visible failure; a missing capability is a locally discoverable inconvenience. The defaults are chosen accordingly. Widen deliberately:
# agent may comment and vote on anyone's changes, but only within two projects
go-gerrit-mcp --groups read,comment,transition --own-changes-only=false --projects core,infraRelated MCP server: Gerrit MCP Server
Install
Binary release: download the binary for your platform from
GitHub Releases, make it executable, and put it on
your PATH:
# macOS on Apple silicon; substitute <os>_<arch> from: linux, darwin, windows x amd64, arm64
curl -Lo /usr/local/bin/go-gerrit-mcp \
https://github.com/GaijinEntertainment/go-gerrit-mcp/releases/latest/download/go-gerrit-mcp_darwin_arm64
chmod +x /usr/local/bin/go-gerrit-mcpDocker:
docker pull ghcr.io/gaijinentertainment/go-gerrit-mcp:latestgo install:
go install dev.gaijin.team/go/go-gerrit-mcp/cmd/go-gerrit-mcp@latestQuick start
The server reads connection identity from environment variables only; credentials never travel through flags:
Variable | Meaning |
| Base URL of the Gerrit instance |
| Account username for HTTP Basic authentication |
| HTTP credential paired with the username |
Generate the credential in Gerrit under Settings → HTTP Credentials (an HTTP password, or an auth token on instances that issue them). All three variables are required; the server exits with an error naming the missing ones.
Claude Code
claude mcp add gerrit \
--env GERRIT_URL=https://gerrit.example.com \
--env GERRIT_USERNAME=your-username \
--env GERRIT_TOKEN=your-http-credential \
-- go-gerrit-mcpAny MCP client (JSON configuration)
{
"mcpServers": {
"gerrit": {
"command": "go-gerrit-mcp",
"args": ["--groups", "read"],
"env": {
"GERRIT_URL": "https://gerrit.example.com",
"GERRIT_USERNAME": "your-username",
"GERRIT_TOKEN": "your-http-credential"
}
}
}
}Docker
{
"mcpServers": {
"gerrit": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "GERRIT_URL", "-e", "GERRIT_USERNAME", "-e", "GERRIT_TOKEN",
"ghcr.io/gaijinentertainment/go-gerrit-mcp:latest",
"--groups", "read"
],
"env": {
"GERRIT_URL": "https://gerrit.example.com",
"GERRIT_USERNAME": "your-username",
"GERRIT_TOKEN": "your-http-credential"
}
}
}
}Per-project configuration in Claude Code
Everything the server needs is read from the environment: the identity variables above plus a GERRIT_MCP_* mirror
for every flag (see Configuration reference). MCP server processes inherit the session
environment, so in Claude Code one user-level registration turns into per-project configuration, down to different
Gerrit instances with different credentials per repository.
~/.claude.json holds the registration, with no env block:
{
"mcpServers": {
"gerrit": {
"command": "go-gerrit-mcp"
}
}
}<project>/.claude/settings.local.json carries the project's environment; every env entry reaches the server
process:
{
"env": {
"GERRIT_URL": "https://gerrit.example.com",
"GERRIT_USERNAME": "your-username",
"GERRIT_TOKEN": "your-http-credential",
"GERRIT_MCP_GROUPS": "read,comment",
"GERRIT_MCP_PROJECTS": "core,infra"
}
}Values shared by most projects can sit one layer down in ~/.claude/settings.json. Settings files merge, with
.claude/settings.local.json over .claude/settings.json over ~/.claude/settings.json, so a project declares only
its deltas. Anything no layer sets falls back to the server's own defaults: read-only, own changes.
The registration's env block stays empty for a reason. A variable named there shadows every settings layer, and
references are no workaround: ${VAR} expands only from the shell environment that launched claude, never from
settings files, and anything unresolved reaches the server as a literal string.
Other MCP clients inherit their launch environment the same way, so per-directory tooling such as direnv achieves the identical split without client support.
Capability groups
Capability is selected at startup via --groups as a comma-separated list. Groups are independent and combinable,
with no privilege ladder: each write-capable group bundles the minimal change-read subset it needs to work on its
own, and enabled groups union.
Group | Tools |
|
|
|
|
|
|
Tools
search_changes: query changes with Gerrit's change query syntax, paginated.get_change: one change in review-relevant detail: status, owner, labels with votes, current revision, messages.list_change_files: files touched by a revision, with per-file change stats.get_file_diff: the diff of one file in a revision.get_change_comments: comment threads on a change, with resolution state and comment ids. Returns unresolved threads only by default;status=allfetches the full history,status=resolvedthe settled threads.post_comments: publish a review in one call: optional top-level message plus inline, range, file-level, and reply comments. Replies anchor to comment ids fromget_change_comments;resolvedtoggles the thread state.set_vote: set a label vote (e.g.Code-Review) with an optional message; value0clears an own vote.transition_change: move a change's state:submit,abandon,restore,wip, orready, with an optional message (submit accepts none). Gerrit's refusal (a blocked submit, a restore of a merged change) is reported verbatim.
Review notifications
An opt-in push channel for review activity. The agent subscribes to a change with subscribe_change; from then on,
new change messages, votes, inline comment threads, and status transitions arrive in the session on their own as
review_activity blocks. The payload uses the same llmxml vocabulary the read tools emit and carries the activity
whole, so nothing needs fetching afterwards. unsubscribe_change ends a subscription early. A merged or abandoned
change ends its own subscription with a final notification that says so, and a change that becomes unreadable
(deleted, or no longer visible to the account) does the same, with the reason spelled out.
Subscriptions are per-session and in-memory: they leave no trace on the Gerrit instance, end with the session, and after a server restart the agent subscribes again. With the feature off (the default) the server is byte-identical to its pre-feature self, with no extra tools or capabilities and no background polling.
Enabling takes both sides:
Server side: pass
--review-notifications=true(or its mirror). The server registers both subscription tools and polls Gerrit every--review-notifications-poll-interval(default60s): one batched query per tick over all subscribed changes, with detail fetches only for changes that actually moved.Client side: delivery uses the Claude Code channels contract (research preview, Claude Code 2.1.80 or newer). For a server registered plainly under
mcpServers, launch withclaude --dangerously-load-development-channels server:<name>, where<name>is the registration key; it becomes thesourceattribute of the injected<channel>blocks. Allowlisted channel plugins load withclaude --channelsinstead.
Research-preview caveats: organization policy can disable channels entirely; the flag syntax may change between Claude Code releases; and a client without channel support silently drops the events, in which case the server behaves exactly as if the feature were off, with no errors on either side.
Noise control is operator configuration. The server applies no heuristics of its own and filters nothing by message tag, because a bot's verdict is often exactly the outcome the agent is waiting for:
the authenticated account's own activity is skipped by default (
--review-notifications-include-ownkeeps it);--review-notifications-exclude-accountssilences accounts by username or numeric ID;--review-notifications-exclude-patternsdrops events whose message or comment text matches a regular expression; an invalid pattern fails startup with an error naming it.
Every flag has a GERRIT_MCP_* mirror that follows the same settings layering as the rest of the configuration
(see Per-project configuration), so a project can enable notifications
and pick exclusions in its own settings file.
Configuration reference
Behavior is configured by CLI flags, each mirrored by an environment variable so one configuration style works for binary and Docker invocations alike. Precedence: the flag wins over its mirror, and the mirror wins over the default.
Flag | Mirror | Default | Meaning |
|
|
| Comma-separated capability groups: |
|
| (empty) | Project allowlist confining every operation, reads included |
|
|
| Refuse trail-leaving operations on changes not owned by the authenticated account |
|
| (empty) | Keep only the listed tools from the group-resolved set |
|
| (empty) | Remove the listed tools from the group-resolved set |
|
|
| Enable review notifications |
|
|
| Poll cadence for subscribed changes, as a Go duration |
|
|
| Keep the authenticated account's own activity in notifications |
|
| (empty) | Accounts (usernames or numeric IDs) whose activity never becomes a notification |
|
| (empty) | Comma-separated regular expressions; matching message or comment text never becomes a notification |
Notes:
--own-changes-onlytakes an explicit boolean value:--own-changes-only=false. A bare flag without a value is a configuration error.Project scoping (
--projects) is enforced server-side: a project clause is injected into every change query regardless of what the agent composed, and direct operations on out-of-scope changes are refused.Tool filters only narrow.
--exclude-toolsremoves tools from what the groups resolved;--include-toolskeeps only the listed subset of it. A tool outside the enabled groups can never be activated by a filter, and exclude wins over include. Filter entries naming no known tool fail startup, so misconfigurations surface immediately.Configuration errors are aggregated: the server reports every problem at once, then exits non-zero.
Output format
Every tool responds in llmxml, an LLM-digestible subset of XML: line-structured, semantically tagged text meant to be read by a model. Attributes carry metadata; element bodies carry content:
<changes query="status:open owner:self" start="0" count="1" more="false">
<change number="12345" project="core" branch="main" status="NEW" owner="Jane Doe (jdoe)" updated="2026-07-10T20:48:32Z">fix scanner initialization</change>
</changes>There is no XML declaration, no namespaces, and no schema; nothing parses it back. If you need machine-readable Gerrit data, use Gerrit's REST API directly; this format is for model consumption.
License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityAmaintenanceMCP Server providing AI agents with tooling for Gerrit code review workflows via stdio transport.Last updated221MIT
- Alicense-qualityDmaintenanceAn MCP server that enables language models to query and manage Gerrit code reviews via the REST API.Last updated1Apache 2.0
- AlicenseBqualityAmaintenanceMCP server that exposes GitHub operations as tools for AI agents, enabling code search, issue management, and PR review.Last updated12MIT
- Flicense-qualityDmaintenanceA minimal MCP server that exposes a focused set of GitHub PR review tools to AI agents, enabling PR listing, detail retrieval, comment viewing, and thread management.Last updated
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
A MCP server built for developers enabling Git based project management with project and personal…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/GaijinEntertainment/go-gerrit-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server