docs: Tools-Tabelle komplett (9 Tools) + Suppression-Write + VULNERABILITY_ANALYSIS
CI / test (push) Failing after 5m23s

This commit is contained in:
2026-06-25 07:30:05 +00:00
parent 271a15cd1f
commit 2b7ec544da
+36 -8
View File
@@ -1,7 +1,8 @@
# dependencyTrack-MCP # dependencyTrack-MCP
MCP-Server fuer [OWASP Dependency-Track](https://dependencytrack.org/), in Rust. MCP-Server fuer [OWASP Dependency-Track](https://dependencytrack.org/), in Rust.
Read-only Zugriff auf Projekte, Findings und Metriken. Ueberwiegend lesender Zugriff (Projekte, Findings, Metriken, VEX/SBOM u.a.) plus
eine geschuetzte Schreib-Operation: Finding-Suppression/Analyse.
Zwei Frontends, eine gemeinsame Tool-Logik: Zwei Frontends, eine gemeinsame Tool-Logik:
@@ -19,7 +20,7 @@ Zwei Frontends, eine gemeinsame Tool-Logik:
``` ```
crates/dtrack-config Config (TOML laden/speichern, Secret-Masking, Persistenz) crates/dtrack-config Config (TOML laden/speichern, Secret-Masking, Persistenz)
crates/dtrack-perms RBAC-Policy (Rollen/Clients, Deny-overrides-Allow) crates/dtrack-perms RBAC-Policy (Rollen/Clients, Deny-overrides-Allow)
crates/dtrack-core DT-REST-Client (reqwest+rustls, read-only) crates/dtrack-core DT-REST-Client (reqwest+rustls)
crates/dtrack-tools rmcp-Server (die Tools) -- transport-unabhaengig, geteilt crates/dtrack-tools rmcp-Server (die Tools) -- transport-unabhaengig, geteilt
crates/dtrack-stdio Bin: stdio-Frontend crates/dtrack-stdio Bin: stdio-Frontend
crates/dtrack-http Bin: HTTP-Frontend (axum + StreamableHTTP + Admin-UI) crates/dtrack-http Bin: HTTP-Frontend (axum + StreamableHTTP + Admin-UI)
@@ -27,18 +28,38 @@ crates/dtrack-http Bin: HTTP-Frontend (axum + StreamableHTTP + Admin-UI)
## Tools ## Tools
Lesend:
| Tool | Argument | DT-Endpoint | | Tool | Argument | DT-Endpoint |
|---|---|---| |---|---|---|
| `list_projects` | -- | `GET /project` | | `list_projects` | -- | `GET /project` |
| `lookup_project` | `name`, `version?` | `GET /project/lookup` |
| `project_components` | `uuid` | `GET /component/project/{uuid}` |
| `project_findings` | `uuid` | `GET /finding/project/{uuid}` | | `project_findings` | `uuid` | `GET /finding/project/{uuid}` |
| `project_metrics` | `uuid` | `GET /metrics/project/{uuid}/current` | | `project_metrics` | `uuid` | `GET /metrics/project/{uuid}/current` |
| `project_violations` | `uuid` | `GET /violation/project/{uuid}` (braucht `VIEW_POLICY_VIOLATION`) |
| `project_vex` | `uuid` | `GET /vex/cyclonedx/project/{uuid}` |
| `project_bom` | `uuid` | `GET /bom/cyclonedx/project/{uuid}` |
Schreibend (braucht das DT-Recht `VULNERABILITY_ANALYSIS`):
| Tool | Argument | DT-Endpoint |
|---|---|---|
| `suppress_finding` | `project`, `component`, `vulnerability`, `suppressed?`, `state?`, `justification?`, `comment?` | `PUT /analysis` |
> `suppress_finding` ist die einzige schreibende Operation. Die drei UUIDs
> (project/component/vulnerability) stammen aus der `project_findings`-Antwort.
> `suppressed` ist standardmaessig `true` (`false` hebt die Unterdrueckung auf).
> Wer nur lesen soll, bekommt einen Key **ohne** `VULNERABILITY_ANALYSIS` --
> dann scheitert der Write serverseitig mit HTTP 403. Im HTTP-Modus zusaetzlich
> per RBAC eingrenzbar (eigene Rolle / `deny`).
## Konfiguration (Umgebungsvariablen) ## Konfiguration (Umgebungsvariablen)
| Var | Pflicht | Bedeutung | | Var | Pflicht | Bedeutung |
|---|---|---| |---|---|---|
| `DTRACK_URL` | ja* | Basis-URL der DT-Instanz (ohne `/api/v1`, wird angehaengt) | | `DTRACK_URL` | ja* | Basis-URL der DT-Instanz (ohne `/api/v1`, wird angehaengt) |
| `DTRACK_API_KEY` | ja* | API-Key eines **read-only** Teams (`VIEW_PORTFOLIO`, `VIEW_VULNERABILITY`) | | `DTRACK_API_KEY` | ja* | API-Key eines Teams. Lesen: `VIEW_PORTFOLIO` + `VIEW_VULNERABILITY` (Policy-Verstoesse: `VIEW_POLICY_VIOLATION`); fuer `suppress_finding`: `VULNERABILITY_ANALYSIS` |
| `DTRACK_INSECURE` | nein | `1`/`true` -> TLS-Pruefung aus (Notbehelf bei internem CA-Cert) | | `DTRACK_INSECURE` | nein | `1`/`true` -> TLS-Pruefung aus (Notbehelf bei internem CA-Cert) |
| `DTRACK_CONFIG` | nein | Pfad zu einer TOML-Config; einmal aus env gebootstrappt, danach massgeblich | | `DTRACK_CONFIG` | nein | Pfad zu einer TOML-Config; einmal aus env gebootstrappt, danach massgeblich |
| `DTRACK_PERMISSIONS` | nein | (nur HTTP) Pfad zur RBAC-Policy; gesetzt -> RBAC statt flacher Token-Liste | | `DTRACK_PERMISSIONS` | nein | (nur HTTP) Pfad zur RBAC-Policy; gesetzt -> RBAC statt flacher Token-Liste |
@@ -114,7 +135,8 @@ volumes:
`docker compose up -d` (apiserver braucht ~4 GB RAM + ein paar Minuten beim `docker compose up -d` (apiserver braucht ~4 GB RAM + ein paar Minuten beim
Erststart). Dann `http://localhost:8082` (Login `admin`/`admin`), unter Erststart). Dann `http://localhost:8082` (Login `admin`/`admin`), unter
**Administration -> Access Management -> Teams** einen API-Key mit **Administration -> Access Management -> Teams** einen API-Key mit
`VIEW_PORTFOLIO` + `VIEW_VULNERABILITY` erzeugen und ein Projekt anlegen. `VIEW_PORTFOLIO` + `VIEW_VULNERABILITY` erzeugen (fuer den Suppression-Test
zusaetzlich `VULNERABILITY_ANALYSIS`) und ein Projekt anlegen.
Aus dem MCP-Container ist die DT unter `http://host.docker.internal:8081` Aus dem MCP-Container ist die DT unter `http://host.docker.internal:8081`
erreichbar (nicht `localhost`). erreichbar (nicht `localhost`).
@@ -241,17 +263,23 @@ leer = offen). Fuer feinere Rechte `permissions.toml.example` nach
Modell: benannte Rollen mit `allow`/`deny` (`"*"` = alle Tools, **deny schlaegt Modell: benannte Rollen mit `allow`/`deny` (`"*"` = alle Tools, **deny schlaegt
allow**), Clients ordnen einen Bearer-Token einer Rolle zu. Ein nicht erlaubter allow**), Clients ordnen einen Bearer-Token einer Rolle zu. Ein nicht erlaubter
`tools/call` wird mit **403** abgewiesen. `tools/call` wird mit **403** abgewiesen. Tipp: das schreibende `suppress_finding`
gezielt nur Auditor-Rollen erlauben (oder breit per `deny` ausschliessen).
```toml ```toml
[[roles]] [[roles]]
name = "metrics-only" name = "read-only"
allow = ["list_projects", "project_metrics"] allow = ["*"]
deny = ["suppress_finding"]
[[roles]]
name = "auditor"
allow = ["*"]
[[clients]] [[clients]]
name = "dashboard-bot" name = "dashboard-bot"
token = "GEHEIM" token = "GEHEIM"
role = "metrics-only" role = "read-only"
``` ```
## Admin-UI ## Admin-UI