18 tools with consistent naming (verb_noun pattern) and descriptions present. All tools have input schemas with Zod validation. However, descriptions are brief (avg ~80 chars, below 194-char baseline), lack WHEN/WHY context, and omit error recovery guidance. Parameter descriptions are minimal. Output schemas are undocumented, LLMs cannot predict response structure. No tool annotations (readOnlyHint/destructiveHint). Error handling returns plain text without actionable recovery steps. Composition is sound (single responsibility per tool), but descriptions need expansion to meet LLM-optimization standards.
Get current WAF configuration paths and settings
Query ModSecurity audit logs
Get interception statistics
Reload nginx configuration
Start nginx
Get nginx running status
Stop nginx
Test nginx configuration syntax
Output schemas undocumented. Tool responses return text/JSON without declared structure. LLMs cannot predict fields or plan downstream calls.
Descriptions lack WHEN/WHY context and are below 20-char minimum for several tools. E.g., 'Get nginx running status' (28 chars) does not explain when to call it vs other nginx tools or what the response contains.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot infer which tools are safe to retry or have side effects without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Add a new SecRule (supports single and chain rules). Validates syntax, writes to config, reloads nginx.
Disable a rule (comment it out)
Enable a disabled rule
Export all rules as text
Get a rule by ID
Import rules from text (chain-aware, splits by SecRule blocks, skips duplicates)
List all ModSecurity rules
Remove a rule by ID
Rollback to the previous rule configuration
Validate SecRule syntax without adding (supports single and chain rules)
Error responses are plain text without recovery guidance. E.g., 'Rule id:123 not found' does not suggest calling rule_list() to discover valid IDs.
Parameter descriptions are minimal or absent. E.g., 'auto_reload' parameter lacks explanation of what happens if false or what 'reload' entails.