Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add rules/eliornl/rolemule/security-middlewaregit clone --depth 1 https://github.com/eliornl/rolemuleWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00000 | $0.02018 |
| Opus 5 | $0.00000 | $0.01009 |
| Sonnet 5 | $0.00000 | $0.00404 |
| Haiku 4.5 | $0.00000 | $0.00202 |
Grade A, and why
security-middleware scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 155 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Security Middleware
Security Headers (Added to Every Response)
main.py adds these via security_headers_middleware:
| Header | Value |
|---|---|
X-Content-Type-Options |
nosniff |
X-Frame-Options |
DENY |
X-XSS-Protection |
1; mode=block |
Referrer-Policy |
strict-origin-when-cross-origin |
Permissions-Policy |
camera=(), microphone=(self), geolocation=() |
Strict-Transport-Security |
max-age=31536000; includeSubDomains (production only) |
These are applied automatically — do not add them manually in endpoint responses.
CORS Configuration
CORSMiddleware is configured with explicit allowed headers — never use allow_headers=["*"].
app.add_middleware(
CORSMiddleware,
allow_origins=origins, # from settings.cors_origins
allow_credentials=settings.cors_credentials,
allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
allow_headers=["Authorization", "Content-Type", "Accept", "X-Requested-With"],
)
allow_origins comes from settings.cors_origins. In production this must be an explicit list of allowed domains — never ["*"]. There is no disable_host_validation escape hatch; configure origins explicitly per environment.
Global API Rate Limiting (100 req/min)
api_rate_limit_middleware applies a 100 requests/minute limit per authenticated user (token hash) or per IP. Applied to all /api/ paths except:
/api/health/api/ws/(WebSocket)/api/v1/auth/login/api/v1/auth/register
This is in addition to per-endpoint rate limits (e.g. 5/hour for sensitive operations). When adding a new high-traffic endpoint that should be exempt, add it to skip_paths.
Client IP for Rate Limiting — Use request.client.host Only
Never use X-Forwarded-For for rate-limit keys. Any client can spoof this header, trivially bypassing per-IP rate limits.
# ✅ Correct — TCP-level address set by the proxy/uvicorn, not spoofable
client_ip = request.client.host if request.client else "unknown"
# ❌ Wrong — spoofable by the client
client_ip = request.headers.get("X-Forwarded-For", "unknown").split(",")[0].strip()
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 155 lines · 0 tokens per session scan A d91e6f05e27c
security-middleware is a cursor rule published in the GitHub repository eliornl/rolemule (37 stars, last pushed 2d ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 2,018 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other cursor rules, from other repositories
real-browser-mcp
Instructions for using Real Browser MCP to control the user's actual browser.
project
Core project context for real-browser-mcp.
invictum-browser
Use Invictum Browser Bridge whenever the user requests IBB, IBG, Invictum Browser Bridge, or Invictum Browser Gate.
imports-order
Ignore unsorted/unformatted import block linting.
cursorrules
Bridge between MCP protocol and Chrome extensions. Connect AI models to browser capabilities.
angular-20
This rule provides comprehensive best practices and coding standards for Angular development, focusing on modern TypeScript, standalone components, signals, and performance optimizations.