wemake-python-mcp
# wemake-python-mcp
Model Context Protocol (MCP) server providing automated code linting, rule explanations, and configuration templates for `wemake-python-styleguide` (WPS).
---
## Features
- **Automatic Venv Resolution**: Automatically detects project virtualenvs (`.venv`, `venv`, `uv`) to execute `flake8 --select=WPS`.
- **Structured Violation Output**: Returns JSON violation reports with file, line, column, rule code, title, category, and message.
- **Offline WPS Rule Database**: Bundled offline lookup database covering all 263 WPS rules (`WPS000`–`WPS699`).
- **Live Scraper & Updater**: Scrapes official documentation to keep rule definitions and links up to date.
- **FastMCP Protocol Support**: Implements tools and resources via standard `stdio` transport.
---
## Prerequisites
- Python 3.10+
- `wemake-python-styleguide` (installed in target project virtual environment or system environment)
- `uv` (recommended) or `pip`
---
## Installation
### Using `uv` (Recommended)
Clone the repository and install dependencies into a local virtualenv:
```bash
git clone https://github.com/your-org/wemake-python-mcp.git
cd wemake-python-mcp
uv venv
uv pip install -e .
```
### Using `pip`
```bash
pip install -e .
```
---
## Usage & MCP Client Configuration
### CLI Usage
Run the server over stdio transport:
```bash
wemake-python-mcp --transport stdio
```
Check version:
```bash
wemake-python-mcp --version
```
### Claude Desktop / Cursor / MCP Client Configuration
Add the following to your MCP client configuration file (e.g., `claude_desktop_config.json`):
#### Using `uv` (Recommended)
```json
{
"mcpServers": {
"wemake-python": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/wemake-python-mcp",
"run",
"wemake-python-mcp"
]
}
}
}
```
#### Direct Executable
```json
{
"mcpServers": {
"wemake-python": {
"command": "/absolute/path/to/wemake-python-mcp/.venv/bin/wemake-python-mcp",
"args": []
}
}
}
```
---
## Tools Reference
| Tool Name | Parameters | Description |
|---|---|---|
| `lint_file` | `path: str` | Lints a single `.py` file using `wemake-python-styleguide` rules. |
| `lint_project` | `directory: str = "."` | Recursively lints a Python project directory. |
| `lint_code` | `code: str` | Lints a raw Python code string snippet. |
| `explain_rule` | `code: str` | Returns documentation, title, category, and URL for a rule (e.g. `WPS432` or `432`). |
| `update_rule_db` | None | Scrapes official readthedocs documentation and updates the local rule database. |
### Sample Tool Output (`lint_file` / `lint_code`)
```json
{
"success": false,
"violation_count": 1,
"violations": [
{
"file": "example.py",
"line": 1,
"column": 5,
"code": "WPS432",
"title": "Forbid magic numbers",
"category": "Best practices",
"message": "Found magic number: 42"
}
],
"summary": "Found 1 wemake-python-styleguide violation across 1 file."
}
```
---
## Resources Reference
| Resource URI | Mime Type | Description |
|---|---|---|
| `wemake://rules` | `application/json` | Categorized index of all WPS rule codes and titles. |
| `wemake://rules/{code}` | `text/markdown` | Full Markdown documentation for a specific rule (e.g., `wemake://rules/WPS432`). |
| `wemake://config/template` | `text/plain` | Recommended `setup.cfg` configuration template for `wemake-python-styleguide`. |
---
## Environment Variables
- `WPS_FLAKE8_PATH`: Explicit path to `flake8` executable. Overrides auto-detection logic.
---
## Development & Testing
Run tests and type checks:
```bash
# Run unit tests
uv run pytest
# Type check
uv run mypy src/ tests/
# Ruff linting
uv run ruff check src/ tests/ scripts/
# WPS styleguide compliance check
uv run flake8 src/ tests/ --select=WPS
```
TDQS
Scored across 5 tools
Each tool has a clearly distinct input type or purpose: lint_file, lint_project, and lint_code differ by input source (file, directory, string), while explain_rule and update_rule_db serve separate functions. There is no overlap ambiguity.
All tool names follow a consistent lowercase snake_case verb_noun pattern (lint_file, lint_project, lint_code, explain_rule, update_rule_db). The naming is uniform and predictable.
With 5 tools, the server is well-scoped for its purpose. It covers multiple linting input modes plus auxiliary rule explanation and database update features without unnecessary bloat.
The tool surface covers the core linting workflows (file, project, code string) and supporting rule utilities. A minor gap is the lack of a direct list-rules tool, but the existing tools handle common use cases effectively.