mcp-review-pr
by thangtn83
README.md
# mcp-review-pr
An MCP (Model Context Protocol) server for **multi-language PR review** with deterministic analysis. It provides AI-powered code review tools that automatically detect languages, apply relevant review guidelines, and run quality checks on your pull requests.
## ✨ Features
- **Skill-Based Architecture** — Modular review skills that auto-activate based on file types, path patterns, and content detection
- **Deterministic Quality Checks** — Run linters and tests as part of the review pipeline, not just AI suggestions
- **Impact Analysis** — Classify changes by architectural layer (UI, domain, infra, shared) and detect breaking changes
- **Smart Diff Chunking** — Automatically splits large PRs into prioritized chunks for incremental review
- **Result Caching** — Cache diff results and guidelines keyed by commit SHA for fast re-runs
- **Custom Rules** — Layer project-specific rules on top of skill-provided guidelines via a simple `rules.md` file
- **Configurable** — Tune behavior with `.mcp.config.json` (ignored files, risk thresholds, max diff size, etc.)
## 📦 Built-in Skills
| Skill | Priority | Activates On | Linter |
|---|---|---|---|
| **Security** | 15 | `.ts`, `.js`, `.tsx`, `.jsx`, `.mjs` + `api/`, `auth/`, `middleware/` paths | — |
| **React** | 10 | `.tsx`, `.jsx` + React imports + `components/`, `pages/`, `app/` paths | ESLint |
| **TypeScript** | 8 | `.ts`, `.mts`, `.cts` | ESLint |
| **Clean Architecture** | 7 | `.ts`, `.js`, `.tsx`, `.jsx` + `domain/`, `usecases/`, `services/`, `repositories/`, etc. | — |
| **JavaScript** | 5 | `.js`, `.mjs`, `.cjs` | ESLint |
Skills are activated automatically when PR diffs match their criteria. Multiple skills can be active simultaneously — their guidelines and rules are merged by priority.
## 🛠 MCP Tools
The server exposes the following tools via the MCP protocol:
| Tool | Description |
|---|---|
| `get_pr_diff` | Get structured file diffs with additions, deletions, and change types |
| `analyze_impact` | Classify changes by layer, detect breaking changes, assign risk level |
| `list_skills` | List all available skills and which ones are active for the current PR |
| `get_skill_guidelines` | Get merged review guidelines from all active skills + custom rules |
| `load_rules` | Load all applicable rules (skill rules + custom repo rules) |
| `run_quality_checks` | Run skill linters and test suites, returns lint issues and test results |
| `generate_review` | Full structured PR review combining all tools into a comprehensive `ReviewOutput` |
## 🚀 Getting Started
### Prerequisites
- Node.js ≥ 18
- npm
### Installation
```bash
npm install
```
### Build
```bash
npm run build
```
### Running as MCP Server
Start the server over stdio transport (for integration with MCP-compatible clients):
```bash
# Using the compiled output
npm start
# Or during development
npm run dev
```
Then configure your MCP client to connect via stdio. For example, in your MCP client config:
```json
{
"mcpServers": {
"review-pr": {
"command": "node",
"args": ["/path/to/mcp-review-pr/dist/server.js"]
}
}
}
```
### Running as CLI
The CLI provides standalone usage without an MCP client:
```bash
# Review the current repository
npx mcp-review
# Compare against a specific branch
npx mcp-review --base develop
# List available skills and which are active
npx mcp-review --mode skills
# Show active guidelines for your PR
npx mcp-review --mode guidelines
# Analyze impact only
npx mcp-review --mode impact
# Output as markdown instead of JSON
npx mcp-review --format markdown
# Use custom skills directory
npx mcp-review --skills-dir ./my-skills
```
#### CLI Options
| Option | Alias | Description | Default |
|---|---|---|---|
| `--repo <path>` | `-r` | Repository path | Current directory |
| `--base <branch>` | `-b` | Base branch to diff against | `main` |
| `--skills-dir <path>` | `-s` | Custom skills directory | Built-in skills |
| `--format <type>` | `-f` | Output format: `json` or `markdown` | `json` |
| `--mode <mode>` | `-m` | Mode: `review`, `skills`, `guidelines`, `impact`, `server` | `review` |
| `--help` | `-h` | Show help | — |
## ⚙️ Configuration
Create a `.mcp.config.json` in your repository root to customize behavior:
```json
{
"productionBranches": ["main", "production"],
"maxDiffLines": 5000,
"failOnRiskLevel": "high",
"ignoreFiles": ["package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
"enableCaching": true
}
```
| Option | Type | Default | Description |
|---|---|---|---|
| `productionBranches` | `string[]` | `["main", "production"]` | Branches considered production |
| `maxDiffLines` | `number` | `5000` | Max diff lines per review chunk |
| `failOnRiskLevel` | `string` | `"high"` | Risk level threshold to flag |
| `ignoreFiles` | `string[]` | Lock files | Files to exclude from review |
| `enableCaching` | `boolean` | `true` | Enable diff/guideline caching |
### Custom Rules
Add a `rules.md` file to your repository root with project-specific review rules:
```markdown
- All API endpoints must validate input with Zod schemas
- Database queries must use parameterized statements
- Components must have display names for debugging
```
These rules are merged with skill-provided rules during review.
## 🧩 Creating Custom Skills
Skills are directories containing three files. Place them in the `skills/` directory (or a custom directory via `--skills-dir`):
```
skills/
└── my-skill/
├── skill.json # Manifest (required)
├── guideline.md # Review guidelines
└── rules.md # Checklist rules
```
### `skill.json` — Manifest
```json
{
"name": "my-skill",
"description": "Description of what this skill reviews",
"version": "1.0.0",
"filePatterns": ["**/*.py"],
"activateOn": {
"extensions": [".py"],
"fileContains": ["import django"],
"pathPatterns": ["views/", "models/"]
},
"priority": 8,
"linter": {
"command": "npx",
"args": ["pylint", "--output-format", "json"],
"fileExtensions": [".py"]
}
}
```
| Field | Required | Description |
|---|---|---|
| `name` | ✅ | Unique skill identifier |
| `description` | — | Human-readable description |
| `version` | — | Semantic version |
| `filePatterns` | — | Glob patterns for relevant files |
| `activateOn` | ✅ | Activation criteria (see below) |
| `priority` | — | Higher = evaluated first (default: 0) |
| `linter` | — | Optional linter configuration |
**Activation criteria** (any match triggers activation):
- `extensions` — File extensions in the diff (e.g., `[".ts", ".tsx"]`)
- `fileContains` — Strings found in diff content (e.g., `["from 'react'"]`)
- `pathPatterns` — Path substrings in changed files (e.g., `["components/"]`)
### `guideline.md` — Review Guidelines
Free-form markdown that provides context and best practices for the reviewer. This is included in the review context when the skill is active.
### `rules.md` — Review Rules
A markdown list of specific, checkable rules:
```markdown
- Use strict type annotations, avoid `any`
- Prefer `const` over `let` where possible
- All exported functions must have JSDoc comments
```
## 🏗 Architecture
```
src/
├── server.ts # MCP server — registers all tools
├── cli.ts # CLI entry point with argument parsing
├── config.ts # .mcp.config.json loader
├── types.ts # Shared TypeScript types
├── cache.ts # Diff and guideline caching (SHA-keyed)
├── chunker.ts # Smart diff chunking with priority ordering
├── retry.ts # Exponential backoff utility
├── skills/
│ ├── index.ts # Public API re-exports
│ ├── types.ts # Skill manifest & runtime types
│ ├── loader.ts # Skill discovery, activation, guideline/rule loading
│ └── runner.ts # Skill linter execution
└── tools/
├── diff.ts # Git diff extraction via simple-git
├── impact.ts # Change impact & risk analysis
├── quality.ts # Lint + test orchestration
├── review.ts # Structured review generation
└── rules.ts # Custom rules.md loader
```
## 📜 Scripts
| Script | Description |
|---|---|
| `npm run build` | Compile TypeScript to `dist/` |
| `npm run dev` | Run in development mode (via `tsx`) |
| `npm start` | Start the compiled MCP server |
| `npm test` | Run tests (Vitest) |
| `npm run test:watch` | Run tests in watch mode |
| `npm run typecheck` | Type-check without emitting |
| `npm run lint` | Lint source files with ESLint |
## 📄 License
MIT
TDQS
A3.5/5.0
Scored across 3 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: load_rules handles loading rules, run_quality_checks performs deterministic checks, and generate_review produces the final review. No overlap or ambiguity.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern with snake_case: load_rules, run_quality_checks, generate_review.
Tool Count5/5
Three tools is ideal for a focused PR review server; each tool has a clear role without being too few or too many.
Completeness5/5
The tool set covers the full workflow: loading rules, running quality checks, and generating a comprehensive review. No obvious gaps for the intended domain.
Maintenance
ActivityInactive
ResponsivenessNo issues