feat(mcp): reference fragments + vault key naming schema + guard fixtures

README: add vault key naming schema (<server-name>-<verwendungszweck>,
kebab-case) and a key-exception example to the mcp/ guard rules.

Reference fragments in mcp/: zugferd-service.yaml (OAuth standard case,
no credential field) and az-zoll-service.yaml (documented key exception
using ${VAULT:az-zoll-service-api-key} placeholder) — neither contains
any secret.

Five invalid mcp fixtures under tests/fixtures/mcp/invalid/ covering all
README-documented failure modes: inline secret, missing server-name
fragment structure, missing url, missing type, wrong placeholder syntax.

Closes az-agent-defaults-95y
This commit is contained in:
m3ta-chiron
2026-08-22 10:26:56 +02:00
parent befb071fea
commit d428d53e9e
10 changed files with 67 additions and 3 deletions
+16
View File
@@ -182,6 +182,10 @@ Layer, nicht auf die nutzerbeschreibbare Ebene.
`` ${VAULT:<key-name>} ``; der echte Key liegt im Vault des Fleet-Repos und
wird erst beim Merge auf dem Controller substituiert. Im Repo bleibt nie ein
Secret.
- **Vault-Key-Namensschema:** `<server-name>-<verwendungszweck>` in
kebab-case — z. B. `${VAULT:az-zoll-service-api-key}` für den API-Key
des Servers `az-zoll-service`. Ein Key pro Credential, im Vault der IT
eindeutig zuordenbar.
**Minimalbeispiel (OAuth-Standardfall):**
@@ -193,6 +197,18 @@ zugferd-service:
enabled: true
```
**Beispiel (dokumentierte Key-Ausnahme):**
```yaml
# mcp/az-zoll-service.yaml — kein OAuth verfügbar: statischer Key aus dem Vault
az-zoll-service:
type: remote
url: https://mcp.example.az.local/zoll
headers:
Authorization: Bearer ${VAULT:az-zoll-service-api-key}
enabled: true
```
**Typische Fehler:** Server-Name fehlt (Datei ist keine Fragment-Struktur),
fehlende `url`, `type` fehlt bei remote, ein Secret im Klartext (Guard bricht
ab — auch in Kommentaren), Platzhalter in anderer Syntax als `${VAULT:…}`.