NEX finds the detection blind spots in your Splunk deployment that you don't know you have then closes them.
NEX is an agentic security solution for the Splunk Agentic Ops Hackathon (Security track). It attacks your own Splunk data the way a bug-bounty hunter would, proves a detection-coverage gap exists (runs the SPL, gets zero hits), runs a self-skeptic pass to suppress false positives, then writes and deploys the detection that closes the gap — as both an SPL saved search and a portable Sigma rule.
It's not a chatbot that describes problems. It closes the loop: find → prove → fix → verify.
Every SOC has detection gaps. Finding them is slow, manual, and depends on an analyst thinking like an attacker. NEX automates exactly that loop using:
- Splunk MCP Server — the agent's hands: enumerate knowledge objects, run SPL, deploy saved searches.
- Splunk Hosted Models (
Foundation-sec-1.1-8b-instruct) — the agent's brain: security-tuned reasoning about attacker TTPs and detection logic. - MITRE ATT&CK — the coverage map the agent reasons against.
- Recon — enumerate indexes, sourcetypes, and existing detections via MCP.
- Attack-think — Foundation-sec picks an ATT&CK technique likely to slip past current coverage.
- Prove the gap — generate + run candidate SPL via MCP; 0 hits = confirmed blind spot.
- Skeptic gate — a second pass tries to disprove the gap (existing rule? missing data?). Kills false positives.
- Ship the fix — emit SPL + Sigma + severity + ATT&CK ID, and deploy the saved search via MCP.
Rule coverage only matters for techniques whose telemetry you actually collect. NEX also runs a
data-source coverage check: it maps high-value ATT&CK techniques to the data sources required
to even observe them, and flags the ones you have no telemetry for at all — techniques that
don't show up as "uncovered," they show up as nothing. Detection coverage = rule coverage ×
data-source coverage. (GET /visibility, the Visibility view, and a recon step in the loop.)
Credit: Splunk Enterprise Architect Marcus House raised this on the project's LinkedIn post.
- SPL command allowlist — any agent-run or deployed SPL is rejected if it contains a write/
exfil/execute command (
delete,outputlookup,sendemail,script,collect, …). A detection tool reads telemetry; it never deletes or shells out. - Human-in-the-loop deploy — set
AUTO_DEPLOY=falseand NEX proposes the detection and waits for analyst approval (POST /deploy/ the Approve & deploy button) instead of deploying it itself. The model proposes; the analyst decides. - Grounded proof — a gap is proven by the technique's real telemetry presence, not by the model's candidate rule, so a weak SPL can never read as "no gap."
| Mode | Data plane | Use |
|---|---|---|
| Sandbox | built-in mock MCP + bundled APT dataset | Judges run it with zero Splunk setup |
| Live | official Splunk MCP Server (:8089/services/mcp) |
Real detection-gap analysis on your instance |
Same agent code; the MCP endpoint is swapped via config.
Status: Sandbox mode is the primary, fully-working path (and the recommended way to evaluate NEX). Live mode is implemented end-to-end; on Splunk Enterprise it additionally requires the KV Store to be healthy so the MCP Server can mint an encrypted token.
# Backend
cd backend
python -m venv .venv && . .venv/Scripts/activate # Windows; use bin/activate on *nix
pip install -r requirements.txt
cp .env.example .env # MODE=sandbox is the default
uvicorn app:app --reload --port 8800
# Frontend (new terminal)
cd frontend
npm install
npm run dev # http://localhost:5173This runs the agent against a real Splunk instance: real knowledge-object enumeration, real SPL searches, and a real deployed saved search.
- Ingest the demo attack dataset (creates the
nexindex data via HEC):python scripts/ingest_demo_data.py --token <HEC_TOKEN> - Create the baseline 'existing detections' (covers T1110/T1059.001/T1078.004, not the exfil):
python scripts/setup_detections.py --user <admin> --password <pw> - In
backend/.env:MODE=splunk_rest SPLUNK_REST_URL=https://localhost:8089 SPLUNK_USER=<admin> SPLUNK_PASSWORD=<pw> SPLUNK_INDEX=nex AI_PROVIDER=foundation_sec # Foundation-Sec-8B via local Ollama; or 'scripted' - Start the backend.
POST /resetre-opens the blind spot between demo runs.
Equivalent transport via the official Splunk MCP Server (#7931) at :8089/services/mcp.
Requires an encrypted MCP token, which needs a healthy KV Store. (On Splunk Enterprise 10.4
the bundled MongoDB/OpenSSL-3 combo can fail to read its TLS key, blocking token creation;
the REST data plane above is functionally equivalent and unaffected.)
foundation_sec (Cisco Foundation-Sec-8B-Instruct, local Ollama), anthropic (dev), or
scripted (deterministic, zero-dep). Live-model calls have a deterministic safety net and
grounding guards so a small model can't produce an off-target or hallucinated result.
See ARCHITECTURE.md and docs/architecture.mmd.
React + TypeScript + Vite + Tailwind + shadcn/ui + React Flow + Framer Motion · Python + FastAPI · Splunk MCP Server · Foundation-sec-1.1-8b · SPL + Sigma.
MIT.