waf_reload_rules
Reload and compile WAF rules from disk to apply rule changes without restarting the MCP server.
Instructions
重新从磁盘加载 WAF_RULES_FILE(或默认 rules/waf_rules.mcp.json)并编译。用于修改规则文件后无需重启 MCP。
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/waf_mcp/server.py:96-102 (handler)The handler function for the 'waf_reload_rules' tool. It calls _reload_engine() to reload rules from disk and returns a success response with stats.
@mcp.tool def waf_reload_rules() -> Dict[str, Any]: """重新从磁盘加载 WAF_RULES_FILE(或默认 rules/waf_rules.mcp.json)并编译。用于修改规则文件后无需重启 MCP。""" eng = _reload_engine() stats = eng.get_stats() return {"success": True, "message": "规则已重新加载", "stats": stats} - src/waf_mcp/server.py:46-49 (helper)The helper function _reload_engine() that creates a new WAFEngine instance (loading rules from disk) and replaces the global engine.
def _reload_engine() -> WAFEngine: global _engine _engine = WAFEngine(str(_rules_path())) return _engine - src/waf_mcp/server.py:97-97 (registration)The @mcp.tool decorator that registers 'waf_reload_rules' as an MCP tool on the FastMCP instance.
@mcp.tool - src/waf_mcp/server.py:98-102 (schema)The return type Dict[str, Any] defines the schema: it returns a dict with 'success' (bool), 'message' (str), and 'stats' (dict from get_stats). No input parameters needed.
def waf_reload_rules() -> Dict[str, Any]: """重新从磁盘加载 WAF_RULES_FILE(或默认 rules/waf_rules.mcp.json)并编译。用于修改规则文件后无需重启 MCP。""" eng = _reload_engine() stats = eng.get_stats() return {"success": True, "message": "规则已重新加载", "stats": stats} - src/waf_mcp/waf_engine.py:125-149 (helper)The WAFEngine.get_stats() method that provides the stats dict returned by the tool (includes rules_file, total_rules, compiled_rules, etc.).
def get_stats(self) -> Dict: """获取规则统计""" categories = {} severities = {} for rule in self.rules: if rule.get("enabled") is False: continue cat = rule.get("category", "other") sev = rule.get("severity", "medium") categories[cat] = categories.get(cat, 0) + 1 severities[sev] = severities.get(sev, 0) + 1 enabled_rules = [r for r in self.rules if r.get("enabled") is not False] return { "rules_file": str(self.rules_file), "total_rules": len(self.rules), "enabled_rules": len(enabled_rules), "compiled_rules": len(self.compiled_rules), "compile_failed": len(self.compile_failures), "compile_errors": self.compile_failures[:50], "categories": categories, "severities": severities, }