SecureOps AI
Detects hardcoded GitHub tokens and secrets in source code during local security audits.
Detects hardcoded GitLab tokens in source code during local security audits.
Detects hardcoded SendGrid API keys in source code during local security audits.
Detects hardcoded Slack tokens in source code during local security audits.
Detects hardcoded Stripe API keys in source code during local security audits.
Detects hardcoded Twilio credentials in source code during local security audits.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SecureOps AIrun security audit on ./my-project"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SecureOps AI
Local security auditing powered by LLMs via Model Context Protocol (MCP) — keep your codebase private, catch flaws locally.
No source code leaves your machine. The MCP server runs regex + AST + filename scans locally, and the LLM orchestrates the audit through secure, sandboxed tools.

Quick Start
# Setup
git clone <repo-url>
cd secureops-mcp
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install -r requirements.txt
# Start the MCP server
python server.pyThat's it. The server listens on stdio (default MCP transport). Now connect any MCP-compatible client.
Related MCP server: guardvibe
Connecting to an MCP Client
Option A: Claude Desktop
Edit your claude_desktop_config.json:
{
"mcpServers": {
"secureops": {
"command": "python",
"args": ["E:/CODE/secureops-mcp/server.py"],
"env": {}
}
}
}Restart Claude. The SecureOps AI tools appear in the MCP tool list.
Option B: VS Code (MCP Extension)
Install the "MCP Client" or "Continue" extension, then add to settings:
{
"mcp.servers": {
"secureops": {
"command": "python",
"args": ["E:/CODE/secureops-mcp/server.py"]
}
}
}Option C: MCP Inspector (Testing)
mcp dev server.pyOpens a web UI where you can test each tool interactively.
Option D: Any MCP SDK Client
from mcp import ClientSession, StdioServerParameters
async with ClientSession(StdioServerParameters(
command="python", args=["server.py"]
)) as session:
tools = await session.list_tools()
result = await session.call_tool("run_local_security_audit", {
"target_dir": "./target_project"
})Using the Tools — Full Walkthrough
Here's what a real audit session looks like (from an actual run against target_project/):
Step 1: Scan directory structure
The LLM requests a file tree — no content is sent:
⚙ scan_directory_structure(target_dir="target_project")Returns:
{"tree": "target_project/\n .env\n App.java\n app.js\n app.py\n main.go\n main.rs\n requirements.txt"}Step 2: Run the security audit
The LLM calls the scan tool:
⚙ run_local_security_audit(target_dir="target_project")Returns findings as structured JSON:
{
"files_scanned": 7,
"summary": {"critical": 9, "high": 9, "medium": 1, "low": 0, "info": 1},
"findings": [
{
"severity": "critical",
"rule_name": "Hardcoded API Key / Secret",
"file_path": "App.java",
"line_number": 6,
"snippet": "private static final String DB_PASSWORD = \"...\"",
"cwe_id": "CWE-312",
"recommendation": "Store secrets in environment variables or a vault service."
}
]
}Step 3: LLM analyses findings
The LLM reads the findings and produces a summary like this:
Security Audit Results — target_project
Severity breakdown: 9 Critical, 9 High, 1 Medium, 1 Info
Key findings by file:
.env — Exposed DATABASE_URL (PostgreSQL credentials) and GITHUB_TOKEN. Add to .gitignore and rotate tokens.
app.py — Hardcoded AWS secret, os.system() command injection, exec() on user input, pickle/yaml.load() insecure deserialization.
app.js — Command injection via cp.exec(), XSS via innerHTML, unsafe eval().
main.go — Hardcoded API secret (sk-live-...).
App.java — Hardcoded DB password.
main.rs — Path traversal via unsanitized file path concatenation.
requirements.txt — No CVEs checked; run pip-audit -r requirements.txt.
Step 4: Targeted file inspection (optional)
If the LLM needs to see specific code to suggest fixes, it calls:
⚙ read_file_securely(filepath="app.py", base_dir="./target_project")
→ {"file": "app.py", "size_bytes": 187, "content": "import os\n..."}Path traversal is blocked — ../server.py returns an access denied error.
Available MCP Tools
Tool | When to Call | What It Returns |
| I want a full audit | JSON with all findings, summary, metadata |
| I want a quick overview | Summary counts only (no findings) |
| I need SARIF output | SARIF v2.1.0 (GitHub/VS Code compatible) |
| I need context before scanning | Tree of files and directories |
| Show me a specific file | File content with path traversal protection |
Features
Zero-knowledge auditing — code never leaves your machine
14 security rules with 39 regex patterns (API keys, SQL injection, XSS, command injection, insecure deserialization, and more)
AST analysis for Python files (detects
eval(),exec(),os.system(),pickle.loads(), variable-based secret detection).env file scanning — detects unquoted
KEY=VALUEsecrets without requiring quotesFilename-based detection — flags
.env,id_rsa,credentials,secrets, and other sensitive filenamesParallel scanning with configurable thread pool
SARIF output (compatible with GitHub Advanced Security, VS Code SARIF viewer)
Path traversal protection on all file reads
.secureops-ignoresupport (.gitignore-style patterns)Configurable rules via
secureops_config.yaml
Architecture
┌──────────────────────────────────────────────────────────┐
│ MCP Client (LLM) │
│ │
│ 1. scan_directory_structure("./project") │
│ ← Gets file tree (paths only, never content) │
│ │
│ 2. run_local_security_audit("./project") │
│ ← Gets JSON with findings + summary │
│ │
│ 3. (optional) read_file_securely("flagged.py", "./project")│
│ ← Gets specific file content (with traversal guard) │
│ │
│ 4. LLM reasons across findings → suggests fixes │
│ NEVER sees: full codebase, non-flagged files │
└──────────────────────────┬───────────────────────────────┘
│ MCP Protocol (local stdio)
┌──────────────────────────▼───────────────────────────────┐
│ SecureOps MCP Server (Python) │
│ │
│ RegexScanner → 14 rules, 39 patterns │
│ ASTAnalyzer → Python AST walker (eval, pickle, etc) │
│ FileScanner → Filename check, .env unquoted secrets │
│ DepScanner → Dependency manifest flagging │
│ SARIF Builder → Standard static analysis format │
└──────────────────────────────────────────────────────────┘.env File Detection
SecureOps AI has specialized KEY=VALUE parsing for .env files — no quotes required:
# Lines like these are caught without needing quotes:
DATABASE_URL=postgres://admin:supersecret@10.0.0.1:5432/prod
GITHUB_TOKEN=ghp_abc123def456ghi789jklFile | Detection | Severity |
| Sensitive File Detected | High |
| Sensitive File Detected | High |
| Unquoted Secret | Critical |
| Hardcoded API Key / Secret | Critical |
Scanned keys: api_key, secret, password, token, access_key, github_token, gitlab_token, slack_token, stripe_key, twilio, sendgrid, jwt_secret, connection_string, database_url
Security Rules (14 rules, 39 patterns)
Rule | Severity | CWE | Languages |
Hardcoded API Key / Secret | critical | CWE-312 | All |
Hardcoded Private Key | critical | CWE-312 | All |
Command Injection Risk | critical | CWE-78 | .py, .js, .ts, .go |
Hardcoded JWT Secret | critical | CWE-312 | All |
Insecure Execution (eval/exec/compile) | high | CWE-95 | .py, .js |
SQL Injection Risk | high | CWE-89 | .py, .js, .ts, .go, .java, .rs, .kt |
Insecure Deserialization | high | CWE-502 | .py, .js, .ts |
S3 / Cloud Permission Exposure | high | CWE-732 | All |
XSS Vulnerability (Unsafe DOM API) | high | CWE-79 | .js, .ts, .jsx, .tsx, .vue, .html |
Path Traversal | high | CWE-22 | .py, .js, .ts, .go, .rs, .java |
Sensitive File Exposure | high | CWE-530 | All (filename) |
Debug / Verbose Mode | medium | CWE-489 | .py |
Hardcoded Internal / Localhost Address | medium | CWE-200 | All |
Open Redirect | medium | CWE-601 | .py, .js, .ts |
AST-level Detection (Python only)
eval()/exec()/compile()— any call, even obfuscatedos.system()/subprocess.Popen(shell=True)— command injectionpickle.load()/pickle.loads()/yaml.load()— insecure deserializationinput()in dangerous context — near shell/exec callsVariable names with secrets —
AWS_SECRET = "...",password = "..."
Configuration
Rules (secureops_config.yaml)
rules:
- name: "My Custom Rule"
patterns:
- "sensitive_pattern"
severity: high # critical | high | medium | low | info
extensions: [".py"] # empty = all file types
cwe_id: CWE-200
recommendation: "Fix it."Validate custom rules:
import yaml, re
data = yaml.safe_load(open("secureops_config.yaml"))
for rule in data["rules"]:
for p in rule["patterns"]:
re.compile(p) # raises if invalid regexIgnore Patterns
Create .secureops-ignore in the target directory:
# .secureops-ignore
*.test.py
migrations/
vendor/Scan Settings
scan:
max_workers: 8 # parallel file scanners
max_file_size_kb: 5120 # skip files larger than 5MBSARIF Output
Run run_local_security_audit_sarif to get SARIF v2.1.0 output. Compatible with:
GitHub Advanced Security — upload to get inline code annotations on PRs
VS Code — install SARIF Viewer extension, open
.sariffileAzure DevOps — SARIF upload task in pipelines
Dashboard
Open dashboard.html in any browser for an interactive visual report:
Severity donut chart
Risk score gauge (0–100)
File-by-file findings breakdown
Full searchable findings table
Export to JSON or SARIF
Docker
docker compose upOr build manually:
docker build -t secureops-ai .
docker run -it -v ./target_project:/app/target_project secureops-aiProject Structure
secureops-mcp/
├── server.py # MCP server (3 analyzers, 5 tools)
├── secureops_config.yaml # 14 rules, 39 patterns, scan settings
├── dashboard.html # Interactive HTML audit dashboard
├── Dockerfile # Container build
├── docker-compose.yml # docker compose up
├── requirements.txt # Python dependencies
├── .secureops-ignore # Per-project ignore patterns (optional)
├── DEVPOST_SUBMISSION.md # Devpost pitch (ready to paste)
├── PRESENTATION.md # Slide deck outline + talking points
├── DEMO_SCRIPT.md # 3-minute video script
├── target_project/ # Demo vulnerable codebase (7 files, 5 languages)
│ ├── .env
│ ├── app.py
│ ├── app.js
│ ├── App.java
│ ├── main.go
│ ├── main.rs
│ └── requirements.txt
└── README.mdThis server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Vlex127/secureops-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server