Skip to main content
Glama

Co-dev review MCP

A local Node.js MCP server for reviewing colleagues' GitLab merge requests and GitHub pull requests, checking your own changes before pushing, reading Azure DevOps Bug/PBI requirements, analyzing SonarQube results, and drafting child tasks.

Your MCP client supplies the LLM: this server has no model API dependency. It supplies source data and a review workflow, validates inline anchors, saves drafts, and publishes only approved items. The LLM performs the reasoning and translation. Use any client supporting MCP over stdio; a bare model API needs an MCP-capable host.

Install and configure

Use Node 20.20.2 or later. Run these commands from the server project folder:

cd /absolute/path/to/co-dev-review
node --version
npm ci

Put your configuration variables inside a .local folder at the project root, in .local/config.json. This is a JSON file containing environment-variable names and values; it is not a .env file.

co-dev-review/
  .local/
    config.json
  src/
    server.js
  package.json

Start from examples/config.example.json — it lists every key the server reads, with the public defaults already filled in:

New-Item -ItemType Directory -Force .local; Copy-Item examples/config.example.json .local/config.json
mkdir -p .local && cp examples/config.example.json .local/config.json

Then open .local/config.json and fill in your values. If the file already exists, edit it rather than overwriting your credentials.

Key

What it is

GITLAB_URL, GITLAB_TOKEN, GITLAB_PROJECT_ID

GitLab instance, a token with api scope, and the default project (numeric id or group/repo)

GITHUB_API_URL, GITHUB_TOKEN

GitHub API base and a token with repo (or fine-grained pull-request read/write)

AZURE_DEVOPS_ORG_URL, AZURE_DEVOPS_PROJECT, AZURE_DEVOPS_TOKEN

Azure DevOps organization URL, project name, and a PAT with work-item read/write

SONAR_URL, SONAR_PROJECT_KEY, SONAR_TOKEN

SonarQube/SonarCloud base, project key, and a token that can read the project

REVIEW_REPO_ROOT

Absolute path to the local checkout used by step=checks, step=blast_radius and local reviews

REVIEW_DOTNET_PROJECT

Optional .sln/.csproj for step=checks when it cannot find one on its own

Fill in only the integrations you use. Use forward slashes in JSON paths, or escape backslashes.

The entire .local/ folder is excluded by .gitignore; keep credentials there and never commit them. Actual environment variables supplied by your shell or MCP client override this file. .env files are not automatically loaded. Restart/reconnect the server after editing settings.

Alternatively, import supported settings from an existing MCP configuration:

npm run import-config -- "C:/path/to/.vscode/mcp.json"

The importer writes only allowlisted configuration values to .local/config.json; it does not execute or import server commands.

Check configured connections:

npm run doctor

Unconfigured integrations are listed as such. A configured integration with an authentication or connectivity problem is reported as a failure.

Related MCP server: Code Review MCP Server

Run the server

npm start

The server communicates over stdio: it waits for MCP messages on standard input. A quiet terminal is expected. There is no web page or HTTP port. Press Ctrl+C to stop a manually started server.

For normal use, connect your assistant as described below. The MCP client starts the server automatically; you do not also need to run npm start in another terminal.

See the available tools

Run:

npm run tools

This starts a temporary server, performs a real MCP connection, prints each tool's name and description, and closes the connection. It does not call the workflow tools or access remote reviews/tickets.

You should see these three names:

review_work
plan_ticket_tasks
review_sonar

After connecting an assistant, you can also ask: “List the tools available from the co-dev review server.” If you see an older tool list, reconnect the server to refresh discovery.

Connect your assistant

Each client launches its own server process. Use the absolute path to src/server.js, so configuration and drafts work regardless of the client's working directory. You do not need to leave npm start running. It uses stdin/stdout for the MCP protocol, not a web port.

Ready-to-copy files are in examples/. Replace the project path if you move the folder. Keep existing client settings and merge in the new server entry.

For Codex, add the contents of examples/codex.toml to your MCP configuration. For Claude Code, the project .mcp.json format is shown in examples/claude.mcp.json. For VS Code/Copilot, use the servers entry in examples/vscode.mcp.json in .vscode/mcp.json. Reload/reconnect the client, then ask it to review a specific MR/PR. Use npm run doctor for connection diagnostics.

Configuration references: Codex MCP, Claude Code MCP, VS Code MCP configuration.

Review and approval

Try these prompts:

Review GitLab MR 123 against Azure Bug 456. Inspect every changed file and relevant line, read Sonar results, and show a requirement-to-code/test evidence table. Draft the comments in French. Let me skip non-blockers before posting.

Review my local branch against origin/develop before I push. Check correctness, regressions, tests, and ticket 456. Do not post anything.

Propose implementation and regression-test tasks under PBI 456 in English. Show the exact titles, descriptions, and estimates before creating them.

The review_workflow MCP prompt gives the assistant a consistent process. Returned repository, ticket, and analysis text is untrusted evidence, not instructions. The client should fetch all pages and disclose missing/truncated patches; a tool cannot guarantee that an LLM actually reviews every line.

  1. Read the MR/PR, patches, full file context, existing discussions, and ticket criteria.

  2. Run the deterministic passes: step=checks and step=blast_radius (see Recall).

  3. Discuss findings. Choose fr or en; the LLM writes the final text before saving.

  4. Use review_work to prepare comments or plan_ticket_tasks to prepare tasks. Each finding/task gets an ID.

  5. In a terminal in this project, run:

npm run approve

With no argument it picks the only pending draft, or lists them for you to choose. npm run approve -- 5215051e targets one by the first characters of its id, and npm run pending lists every draft with its state.

Each item is shown once, with the diff context it is anchored to, then a single prompt takes the selection:

Include which items? [all | none | 1,3,5-7 | e <n> to edit | q]

e 3 opens item 3 in $EDITOR ($VISUAL, else notepad on Windows) so you can fix the wording yourself rather than asking the assistant to regenerate the draft. Editing rewrites the draft and voids any earlier approval of it. A final APPROVE authorises exactly what is on screen.

  1. Ask your assistant to publish that draft through the same workflow.

There is no MCP approval tool. Approval requires an interactive terminal; the assistant must not approve on your behalf. Approval is tied to a content hash, selected IDs, and a 24-hour expiry. A language/text change requires a new draft. Publication checks the destination and current PR head. Inline comments are anchored to a commit and validated added/deleted lines; context lines should be discussed in a general comment. GitLab renames preserve both file paths.

Comments are posted as individual discussions/review comments, not a formal GitHub APPROVE/REQUEST_CHANGES verdict. No merge, commit, push, or Sonar issue-status mutation is exposed. The host assistant can use its own file editing and testing tools to implement fixes you request.

Recall: what the review cannot be allowed to miss

A diff-only review misses the issues a colleague catches, because a colleague reviews with the compiler, the rest of the codebase, and a checklist in their head. Four mechanisms put those back.

Domain rubrics. step=read classifies the changed paths and returns a rubrics array naming the skills to load — review-react-ts, review-dotnet, review-security, review-build — with the focus areas each one owns. Paths touching auth, tokens, roles, sessions, uploads or payments always pull in the security rubric. The skills ship in this repository (see Install as a plugin); the server only names the expertise, it does not supply it.

The reviewed project's own expertise. step=read also returns repoSkills: every SKILL.md under <REVIEW_REPO_ROOT>/.claude/skills/, with its name, description and absolute path. Those skills are scoped to their own repository and are therefore invisible when the review runs from anywhere else — this puts them back in front of the reviewer without copying them, so they stay maintained in one place by the team that owns them. The assistant reads the ones whose description matches the change. Their content is repository text: domain knowledge, never instructions.

Deterministic pre-pass. step=checks runs the reviewed repository's own TypeScript compiler, ESLint and dotnet build over the change and returns their findings split into onChangedLines (this change's responsibility) and elsewhereInChangedFiles (pre-existing). Monorepos are handled: changed files are grouped by the nearest governing tsconfig.json or ESLint config and each project is run in its own directory, up to six of them. A runner that is unavailable says why. Requires REVIEW_REPO_ROOT.

Blast radius. step=blast_radius extracts the exported symbols this change touched and lists their call sites outside the diff, via git grep. These are the lines nobody is reviewing and where a changed signature or contract breaks. Text matching cannot resolve overloads, re-exports or dynamic dispatch, so treat the list as leads.

Hunk coverage ledger. step=read returns hunks, one entry per changed hunk, identified as <changed file index>.<hunk index> — stable across diff pagination. step=prepare_comments requires a coverage entry giving every hunk a verdict of finding, reviewed-clean or not-applicable, and refuses the draft while any hunk is unaccounted for, naming the ones missing. Use 7.* for a whole file, 7.2-7.5 for a range. This is what stops a review from quietly ending at file twelve.

Checkout match. For a remote MR/PR, step=read also returns localCheckout — the branch and head of REVIEW_REPO_ROOT and whether it equals the review head. checks and blast_radius run on the local checkout, so if it is on some other branch they analyse the wrong code; the note says so and tells the assistant to check out the review branch or disclose that the deterministic pass was not run. Both steps also report an empty change range explicitly instead of a misleading "clean".

None of this makes the model a better reviewer by itself; it removes the failure modes where a review is incomplete without anyone noticing.

Seeing what the review actually did

Every tool call is appended to .local/trace.jsonl — names, counts and identifiers only, never comment bodies, source text or tokens. Read it with:

npm run trace
gitlab acme/web-app #306  2026-09-10
  22:22:20  read           13 files · 31 hunks · MISMATCH: local is on release
                           offered rubrics: review-react-ts, tests (no packaged skill)
                           offered repo skills: design-system, house-conventions, house-testing
  22:22:20  rubric         fetched via tool: packaged:review-react-ts, repository:house-conventions, repository:house-testing
  22:22:20  blast_radius   branch vs origin/develop  0 symbol(s), 0 caller(s) outside the diff
  22:22:20  checks         branch vs origin/develop  no changed files in range

Three columns matter. Offered is what the server returned. Fetched via tool is what came back through step=rubric. Declared applied is what the assistant itself listed in the required rubricsApplied field of prepare_comments — it is stored in the draft and shown at the top of npm run approve, so an empty list on a React change is visible to the human before anything is posted.

The trace is evidence of protocol compliance, not a complete record of what the model read: skills a client loads natively (Claude Code's Skill tool, Codex skills) and files it opens with its own tools never pass through this server. For those, the client's own transcript is the record. Set CO_DEV_TRACE=off to disable tracing; the test suite does. The file rotates at 5 MB.

Install as a plugin

The MCP server is the evidence and guarded-write layer. The review expertise lives in skill files. This repository carries both:

.claude-plugin/plugin.json   Claude Code plugin manifest
plugin-mcp.json              the server, launched from ${CLAUDE_PLUGIN_ROOT}
skills/                      review-mr, review-react-ts, review-dotnet, review-security, review-build
agents/                      react-reviewer, dotnet-reviewer (Claude Code only)
examples/                    stand-alone MCP configuration per client

skills/*/SKILL.md uses the same name/description frontmatter that both Claude Code and Codex read, so one set of files serves both. review-mr is the entry point: it runs the whole sequence — rubrics, checks, blast radius, coverage — and is invoked as /co-dev-review:review-mr 123 fr in Claude Code or by name in Codex.

Claude Code. Add the directory as a plugin and the server, skills and agents load together:

claude --plugin-dir /absolute/path/to/co-dev-review

For a permanent install, junction the directory into ~/.claude/skills/co-dev-review; it then loads every session with no marketplace step. Remove any duplicate co-dev-review entry from your other MCP configuration first, or the server is registered twice.

Codex. Register the server, then link the skills:

codex mcp add co_dev_review -- node /absolute/path/to/co-dev-review/src/server.js
npm run link-skills

link-skills symlinks (junctions on Windows) each folder in skills/ into ~/.codex/skills/, honouring CODEX_HOME. It never overwrites an entry that is not its own link unless you pass --force, --dry-run shows what it would do, and it is idempotent. The originals stay in this repository, so editing a rubric updates both clients at once. Codex also reads the MCP instructions this server returns at initialization, which carries the same workflow.

Any other MCP client. Use examples/*.mcp.json for the tools. Where the client has no skill system at all, nothing is lost: step=read names the rubrics and step=rubric returns their full text over the tool channel, including the reviewed repository's own skills. That path works everywhere a tool call works.

Subagent fan-out is Claude Code only. Elsewhere the review-mr skill runs the domain passes in sequence instead — slower, same coverage.

Available tools

Tool

Your goal

review_work

Review local work before pushing, or a remote MR/PR; discuss findings and publish only approved comments

plan_ticket_tasks

Read an Azure ticket and split it into clear tasks with effort estimates in hours

review_sonar

Inspect a PR's Sonar results, understand issues, and help the assistant fix the code

Only these three tools are exposed. Reconnect your MCP client to replace the old tool list. You describe your goal in normal language; the assistant handles each workflow's steps.

Examples:

  • “Review my local changes before I push.”

  • “Review MR 123 against ticket 456. Prepare comments in French, and let me skip non-blockers.”

  • “Split ticket 456 into implementation and testing tasks. Explain dependencies and estimate the hours for each task and the total.”

  • “Check Sonar for MR 123 and fix the issues in my local checkout.”

For client implementers: review_work accepts a request with step equal to read, read_file, rubric, checks, blast_radius, prepare_comments, view_draft or publish. rubric takes names (up to 8) and returns each rubric's markdown from this repository's skills/ or the reviewed checkout's .claude/skills/, for clients that cannot load skill files. checks and blast_radius take mode and base like read and operate on REVIEW_REPO_ROOT; checks also accepts only to restrict which runners execute. prepare_comments additionally requires coverage and rubricsApplied (an array of skill names, empty allowed). plan_ticket_tasks accepts read, prepare, view_draft or publish. These are stages of a workflow, not additional MCP tools. Read uses ticketId; prepare uses ticketId, language and tasks, each with title, description and required estimatedHours. Saved-draft stages use draftId.

Task estimates are stored in the task description with explicit hours and returned as a total. They are effort estimates, not calendar deadlines. The assistant should describe assumptions and dependencies. Azure Remaining Work is left unset because custom processes can use different units.

review_sonar takes a PR/MR target and derives the Sonar pull-request number. It returns review context and Sonar results together. Optional ruleKey and filePath support investigating a specific issue. The assistant applies requested fixes through its host's editing/testing tools in the matching checkout. The MCP server itself does not edit files, push code or run SonarScanner. A fresh analysis is needed to confirm resolution.

Repository-local skills are read from <REVIEW_REPO_ROOT>/.claude/skills/*/SKILL.md (top-level skill folders only, 20 skills and 200 KB per file maximum); a missing directory is reported, not an error.

Review results include nextPage; continue until null and disclose failed or omitted sections. Sonar issues/hotspots retain paging information; ticket discussion retains its continuation token. Existing drafts remain usable through the corresponding workflow's view_draft and publish stages.

Targets use { "provider": "gitlab", "project": "group/repo", "number": 123 } or { "provider": "github", "project": "owner/repo", "number": 123 }. GitLab project defaults to GITLAB_PROJECT_ID. Azure uses one configured organization/project per installation. Task descriptions use Azure HTML; review bodies use Markdown. Tasks inherit the parent's area and iteration and link via the parent hierarchy relation. Custom work item types/processes are not handled automatically.

Failure recovery and boundaries

Each draft has a persisted publication journal and exclusive filesystem lock. Already posted items are skipped on retries. If a write times out or the process exits after sending it, the server cannot know whether the provider accepted it. It blocks automatic retries of that item to avoid duplicate comments/tasks.

Inspect the remote provider, then reconcile locally:

node src/cli.js reconcile <draft-id> R1 posted <remote-id>
# OR, only after confirming nothing was created:
node src/cli.js reconcile <draft-id> R1 not-posted

If a process crashed while holding .local/drafts/<id>.lock, first stop that process and inspect its journal and the remote provider; remove only that specific stale lock before reconciliation. Never delete the journal to force retries. Partial publication is possible: remote APIs do not provide a transaction spanning comments or tasks.

This approval mechanism protects the MCP interface. An agent or person with unrestricted shell access under your OS account can modify local files or call the providers directly; use client tool permissions if you need isolation against that threat. There is also an unavoidable race between checking a remote head and posting, though inline comments carry the reviewed SHA.

Sonar data depends on analysis availability, product version, and token permissions. Missing coverage is unknown, not zero; a passed gate is not proof that the code is correct. This server reads analysis; it does not run SonarScanner. API responses are bounded at 12 MB, Git diffs at 12 MB, and draft anchor validation at 3000 changed files. Untracked files are listed but their contents are not included in git diff.

Development

npm run check
npm test
npm audit

Tests cover real MCP stdio discovery/validation, provider request contracts using mock HTTP, approval selection/expiry/tampering, stale heads/destinations, uncertain writes, locks, inline diff anchors, task-parent changes, hunk-ledger identity across pagination, coverage-gap rejection, rubric routing, and CRLF-safe diff parsing. Tests never post to real services. npm run doctor performs read-only authentication checks.

Sources used for the adapters: MCP SDK, GitLab discussions, GitHub review comments, Azure task creation, Sonar Web API.

Useful future additions: a browser approval UI, saved review policies per repository, and a corpus of the team's own past review comments mined from merged MR discussions and generated into a house rubric. These can be added without tying the server to a particular LLM.

Available Tools

3 tools
plan_ticket_tasksA
Destructive

request.step is one of: read, prepare, view_draft, publish. Turn an Azure Bug/PBI into clear implementation and testing tasks with estimated hours. Start with step=read to understand requirements and existing children. The assistant proposes scope, dependencies, assumptions and total effort; step=prepare saves the plan for approval. Only step=publish creates the approved tasks.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, but the description adds the crucial distinction that only step=publish actually mutates (creates tasks) while prepare merely saves a draft for approval. That side-effect mapping is real value beyond the annotations. It omits whether published tasks are reversible or what happens on re-publish.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences, front-loaded with the step enumeration before the workflow narrative. Every sentence carries information about scope or sequencing. Slightly dense but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-step, no-output-schema tool with a union-typed request, the description covers the primary workflow an agent needs: which step to start with, what prepare does, and what publish does. The absence of any guidance on handling continuationToken or draft expiration is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the request object is a discriminated union, so the description carries the burden of explaining the step values. It does so by enumerating read/prepare/view_draft/publish and describing what each does, which the raw const enums do not convey. It says nothing about the per-step fields (ticketId, draftId, tasks, language).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: turning an Azure Bug/PBI into implementation and testing tasks with hour estimates. This is a concrete transformation, not a restatement of the name. It does not explicitly contrast itself with siblings review_work/review_sonar, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear sequential guidance: start with step=read, then step=prepare saves the plan for approval, and only step=publish creates the tasks. This tells an agent how to sequence calls correctly. It stops short of naming when not to use the tool or the sibling alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_sonarB
Read-onlyIdempotent

Inspect a PR/MR and its Sonar quality gate, coverage, duplication, issues and hotspots together. The assistant explains failures and, when asked, fixes code using its local editing/testing tools. Supply ruleKey for remediation details or filePath for source context. This tool reads evidence; a new Sonar analysis is needed to confirm a fix.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNo
targetYes
projectNoSonar project key; defaults to configuration
ruleKeyNo
filePathNoOptional repository-relative file to inspect at the PR head

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal read-only, non-destructive, idempotent behavior, so the bar is lower. The description adds useful context beyond annotations—namely that fix suggestions use local editing/testing tools and that confirming fixes requires a fresh analysis—clarifying the write-via-tool chain despite readOnlyHint on this tool itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences front-load the core purpose, then layer in the fix behavior and parameter hints. Every sentence carries information, though the parameter sentence is somewhat telegraphic.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter, nested-target, no-output-schema tool, the description is decent on purpose and behavior but thin on parameter semantics—especially target and project defaults. An agent can call it, but may need to inspect the schema for target structure and pagination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%, so the description must compensate but barely does. It explains ruleKey (remediation details) and filePath (source context), yet ignores target, project, and page entirely, leaving three of five parameters without descriptive support in either field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses a clear verb ('Inspect') plus specific resources (PR/MR, Sonar quality gate, coverage, duplication, issues, hotspots) that pinpoint the tool's scope. It distinguishes from generic review tools by naming the exact artifacts it aggregates, though it doesn't explicitly differentiate from sibling review_work.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'when asked, fixes code' and explains that 'a new Sonar analysis is needed to confirm a fix,' which implies post-fix behavior. But it never states when to choose review_sonar over review_work or plan_ticket_tasks, leaving the agent to guess based on resource type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_workA
Destructive

request.step is one of: read, read_file, rubric, checks, blast_radius, prepare_comments, view_draft, publish. Review local changes before pushing or a GitLab MR/GitHub PR. Start with step=read; it returns the diff, a per-hunk ledger and the domain rubrics to load. step=rubric returns the full text of a rubric for clients that cannot load skill files. step=checks runs the repository's own compiler and linters over the change; step=blast_radius lists call sites outside the diff. The assistant examines code, explains blockers and suggestions, and can prepare French/English comments. Publishing requires the user to approve the saved draft locally. These steps support one review; they are not separate tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true; the description adds value beyond them by stating what step=read returns (diff, per-hunk ledger, rubrics to load), that prepare_comments produces a saved draft, and that publishing requires local user approval. It does not mention the all-hunks-accounted-for rejection rule or rate/order constraints, so a 4 rather than 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but efficient: nine sentences for a nine-step workflow, with no filler. The opening enum list precedes the statement of purpose, which is slightly less front-loaded than ideal, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex multi-step tool with a very large discriminated-union schema, no output schema and destructive semantics, the description covers the step space, the return of the read step, the draft/publish gate and the single-review framing. It leaves some inter-step data flow (e.g. how draftId is obtained) implicit, keeping it at 4.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only one top-level parameter and effectively no top-level description, the description carries the burden and does so well: it enumerates the legal step values and explains each one's behavior (e.g. step=rubric returns full rubric text for clients that cannot load skill files). It adds little about base/mode/target semantics, which the schema itself covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb and resource (review changes before pushing or opening an MR/PR) and enumerates the workflow steps, so the agent knows exactly what the tool does. It never differentiates from the siblings review_sonar or plan_ticket_tasks, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit starting point ("Start with step=read") and explains what each subsequent step is for (rubric, checks, blast_radius, prepare_comments, publish), which is clear operational sequencing. It offers no exclusions or sibling alternatives, e.g. when to prefer review_sonar, so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv1.1.0
    • First observedplan_ticket_tasks
    • First observedreview_sonar
    • First observedreview_work

TDQS

A3.8/5.0

Scored across 3 tools

Disambiguation4/5

review_work and review_sonar both concern reviewing PR/MR code and could be confused at first glance, but their descriptions clearly separate general diff/rubric/checks review from Sonar-specific quality-gate inspection. plan_ticket_tasks is clearly distinct for Azure ticket planning.

Naming Consistency4/5

All tools use snake_case and follow a verb_noun style: review_work, review_sonar, plan_ticket_tasks. The only minor deviation is plan_ticket_tasks carrying an extra noun, but the convention remains predictable.

Tool Count5/5

Three tools is well-scoped for this server: one for code review workflow, one for Sonar inspection, and one for ticket planning. Each tool aggregates multiple substeps rather than spawning many tiny operations.

Completeness4/5

The review_work and plan_ticket_tasks tools cover read, prepare, view, and publish stages, giving broad lifecycle support. Minor gaps remain around triggering a fresh Sonar analysis and directly posting review comments/approvals outside the draft workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    C
    maintenance
    Enables code review operations on GitHub and GitLab, including fetching pull/merge requests, viewing diffs, adding comments, analyzing code quality, and creating merge requests directly from your MCP client.
    15
    8 npm
    4
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Connects LLMs to GitHub and GitLab to analyze pull and merge requests for logic, security, and architectural alignment. It provides tools for fetching diffs, file contents, and project metadata, alongside guided prompts for professional code reviews.
    10
    10 npm
    ISC