The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Wrg Sigma Rules listing page.
Sigma detection-rule authoring, validation and multi-backend conversion, delivered as a Model Context Protocol (MCP) server with a published rule corpus. It runs under Claude Code, Codex, Cursor and any MCP-capable client.
draft_rule turns a natural-language description into a Sigma
YAML scaffold. validate_rule checks a rule against pySigma plus a
best-practice linter. convert_rule compiles a rule to a Splunk, Elastic,
OpenSearch, Wazuh or Kibana query.sigma-rule-writer, sigma-rule-reviewer and
threat-coverage-gap-analyzer.status:
(see Rule status).convert_rule reports the
52
correlation rules in the corpus as a capability gap and names the backends that
can convert them.The plugin is installed directly from this repository; it is not yet listed in a plugin marketplace.
The server is a single stdio MCP process (server.py). Each client points at it
in its own way.
requirements.txt is not optional: validate_rule needs pySigma, convert_rule
needs the backend packages, and the pipeline packages drive the logsource
mapping. The repo ships .claude-plugin/plugin.json and .mcp.json (which wires
server.py through ${CLAUDE_PLUGIN_ROOT}). Point your Claude Code plugin
configuration at this checkout per
the plugin docs.
The Codex plugin carries a self-contained runtime snapshot of the server and
corpus, so its installed cache does not rely on checkout-relative paths. Keep it
current with python scripts/sync_codex_runtime.py; CI fails if it drifts.
Cursor speaks MCP directly, so the same server works with no plugin manifest. Add
it to your project .cursor/mcp.json (or the global ~/.cursor/mcp.json):
Replace the path with your clone, then reload Cursor's MCP servers.
server.py is a standard stdio MCP server, so Cline, Continue, Zed and Windsurf
load it with the same mcpServers block shown for Cursor. MCP is model-agnostic:
the client's backend model does not change what the server exposes.
Validate and convert a corpus rule end to end, from the repo root:
Full captured output (validate JSON, Splunk SPL, Elasticsearch Lucene) is in
DEMO.md.
Every rule lives under resources/examples/<tactic>/ and is one of two kinds:
template_*: a canonical detection shape to adapt to your own environment.observed_*: derived from a specific, cited incident. CONTRIBUTING.md sets
the bar these must clear.resources/examples/INDEX.json enumerates every
rule, and the wrg-sigma://coverage/mitre-attack-matrix resource computes the
technique-by-tactic breakdown from the corpus at read time. Some rules add a
prose write-up under docs/detection-notes/.
This corpus uses Sigma's status: field literally rather than aspirationally:
status: | Count | Meaning here |
|---|---|---|
test | 82 | Derived from a real, cited incident (the observed_* rules) |
experimental | 214 | Canonical detection shapes, many self-described as synthetic exemplars |
stable | 0 | Unused, deliberately |
stable in the Sigma specification means a rule runs in production and is well
tested. Nothing here has earned that, so nothing claims it. Treat every rule as a
starting point to bind to your own logsource and tune; each rule's
falsepositives: block names the benign activity to expect first.
wrg-sigma://patterns/canonical-5 and wrg-sigma://patterns/canonical-5/{01..05}:
canonical detection-pattern definitions.wrg-sigma://coverage/mitre-attack-matrix: an ATT&CK coverage rollup computed
from the corpus at read time.python readme_stamp.py --check
fails CI on any drift, so the numbers here cannot silently go stale.Contributions are welcome. Add YAML under resources/examples/<tactic>/ with an
ATT&CK mapping in tags: (for example attack.t1071), the observed_* or
template_* prefix, and a passing validate_rule. Corpus CI rejects broad empty
matches, unsafe regex, unroutable logsource blocks, draft scaffolding and
deprecated aggregation-pipe syntax.
Read CONTRIBUTING.md before submitting an observed_* rule.
It sets the sourcing bar (attribution, platform and manifestation, each matched
against the cited source) and documents the three upstream rejections that
produced it.
MIT; see LICENSE. One license covers both the tooling (server.py,
tools/, scripts/) and the corpus (resources/). That is a deliberate choice
for frictionless reuse by SOC teams adapting a rule into their own tooling, over
the attribution-preserving split that some Sigma corpora use.
Runtime dependencies bring in LGPL-2.1/3.0 packages (pySigma and its backends)
alongside MIT, BSD and Apache ones. Importing an LGPL library does not make this
repo's own code LGPL. The dependency-licenses CI job carries the re-derivable
list.
Full index at github.com/WRG-11.