Skip to main content
Glama
axel-avb

BSL MCP Analyzer

by axel-avb
README.md
# BSL MCP Analyzer

**English** · [Русский](README.ru.md)

MCP server for analyzing 1C/BSL code: project-wide diagnostics and per-method
cyclomatic/cognitive complexity with a ranked refactor triage. Built on the pure-Python
[`onec-hbk-bsl`](https://github.com/mussolene/1c_hbk_bsl) engine — **no Java, no LSP bridge**.
Served over Streamable HTTP behind nginx with bearer-token auth, one service per project.

## Why

`onec-hbk-bsl` already ships a full BSL analyzer, a formatter, an index, and its own MCP
server. This project reuses all of it and adds the pieces that were missing for day-to-day
work on large 1C configurations:

- **`complexity`** — raw cyclomatic + cognitive complexity for every method
  (upstream exposes these only as threshold warnings with no numbers).
- **`module_health`** — complexity merged with security/performance/SQL diagnostics,
  attributed per method and ranked by refactor priority ("what to fix first").
- **`workspace_diagnostics`** — whole-project lint with aggregation by rule/severity/file.

Plus small-model-friendly titles and descriptions for all 25 tools, and a ready Docker
Compose + nginx deployment.

## Features

- **Diagnostics**: 180+ BSL/1C rules (onec-hbk-bsl registry), inline `noqa`/`bsl-disable`
  suppressions, `select`/`ignore`, whole-project aggregation.
- **Complexity**: per-method McCabe and cognitive metrics, configurable thresholds
  (defaults 20 / 15), over-threshold flags.
- **Refactor triage**: `module_health` scores security ×10, performance/sql ×4 plus
  complexity overage, and returns a sorted `top_targets` list.
- **Full navigation toolbox** inherited from onec-hbk-bsl: symbols, definitions,
  references, callers/callees, hover, search, rename, format, fix, 1C metadata.
- **Multi-project**: one container per project, `1:1` host↔container path mounts.
- **Agent-friendly**: every tool has an explicit what/when/args/returns/example block.

## Architecture

```
MCP agents ──HTTP──> nginx (/bsl/<proj>/mcp, Bearer) ──> bsl-<proj>:8051/mcp
                                                          └── <project> (mounted 1:1)
                                                             onec-hbk-bsl engine (Python)
```

```
src/bsl_mcp/entrypoint.py            bootstrap env → onec-hbk-bsl FastMCP app → +3 tools → HTTP
src/bsl_mcp/lsp_facade.py            single adapter to onec-hbk-bsl internals
src/bsl_mcp/tool_docs.py             titles/descriptions/instructions for all tools
src/bsl_mcp/tools/complexity.py      complexity tool
src/bsl_mcp/tools/module_health.py   module_health tool
src/bsl_mcp/tools/workspace_diagnostics.py  workspace_diagnostics tool
docker-compose.yml                   bsl-<proj> services + nginx
nginx/templates/default.conf.template  routing + bearer + SSE-friendly proxy
```

## Requirements

- Linux host with Docker Engine 24+ and Compose v2.
- 2 GB RAM / ~2 CPU per project (indexing large configurations is CPU-disk heavy).
- A free port for nginx (default `8080`).

## Quick start

```bash
cp .env.example .env
# edit .env: BSL_MCP_TOKEN and PROJ_A_PATH/PROJ_B_PATH/PROJ_C_PATH
docker compose up -d --build
docker compose ps
```

Verify (expect `200`; without the header — `401`):

```bash
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/bsl/proj-a/mcp \
  -X POST -H 'Authorization: Bearer <TOKEN>' \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'
```

### Connect an agent

opencode (`opencode.json`):

```json
{
  "mcp": {
    "bsl-trade": {
      "type": "remote",
      "url": "http://HOST:8080/bsl/proj-a/mcp",
      "headers": { "Authorization": "Bearer <TOKEN>" },
      "enabled": true
    }
  }
}
```

Cursor / Claude and other `mcpServers` clients:

```json
{
  "mcpServers": {
    "bsl-trade": {
      "type": "streamable-http",
      "url": "http://HOST:8080/bsl/proj-a/mcp",
      "headers": { "Authorization": "Bearer <TOKEN>" }
    }
  }
}
```

## Tools

Added by this project:

| Tool | Purpose |
|---|---|
| `complexity(file)` | Cyclomatic + cognitive complexity per method, thresholds and flags |
| `module_health(file)` | Complexity + security/performance/SQL diagnostics, ranked `top_targets` |
| `workspace_diagnostics(path, min_severity, select, ignore, top_n)` | Project-wide lint aggregated by rule/severity/file |

Inherited from onec-hbk-bsl (22 tools): `bsl_status`, `bsl_find_symbol`,
`bsl_file_symbols`, `bsl_definition`, `bsl_hover`, `bsl_callers`, `bsl_callees`,
`bsl_references`, `bsl_read_file`, `bsl_search`, `bsl_diagnostics`, `bsl_check_file`,
`bsl_list_rules`, `bsl_index_file`, `bsl_format`, `bsl_rename`, `bsl_fix`,
`bsl_workspace_scan`, `bsl_meta_object`, `bsl_meta_collection`, `bsl_meta_index`,
`bsl_contract_version`.

## Configuration

| Variable | Required | Description |
|---|---|---|
| `BSL_MCP_TOKEN` | yes | Bearer token agents must send |
| `NGINX_PORT` | no | Host port for nginx (default `8080`) |
| `PROJ_A_PATH`, `PROJ_B_PATH`, `PROJ_C_PATH` | yes | Absolute host paths of 1C projects (mounted 1:1) |

Service name must be `bsl-<proj>` for `/bsl/<proj>/...` routing. Index settings
(`index-mode`, `select`/`ignore`, `exclude`) come from `onec-hbk-bsl.toml` in the
project root.

## Documentation

- [QUICKSTART.md](QUICKSTART.md) — full deployment guide (Russian)
- [docs/tls-letsencrypt.md](docs/tls-letsencrypt.md) — HTTPS via Let's Encrypt, step by step (Russian)
- [docs/bsl-lsp-go-overview.md](docs/bsl-lsp-go-overview.md) — analysis of the previous Go bridge (Russian)

## Credits

- Analysis engine, parser, index and base MCP surface:
  [`onec-hbk-bsl`](https://github.com/mussolene/1c_hbk_bsl) (MIT).
- Diagnostic rule corpus adapted from
  [`BSL Language Server`](https://github.com/1c-syntax/bsl-language-server).