streamable-httpupdated 4mo ago
Dredd MCP is a pre-invocation security check for the Model Context Protocol ecosystem. Before your agent calls a tool on any other MCP server, Dredd renders a verdict: BLOCK, ADVISORY, or ALLOW. Every verdict is HMAC-signed and cites the IOC or behavioral signal that drove the decision.
ΒΏQuΓ© puedes hacer con Dredd MCP?
Dredd MCP β Pre-Flight Security for the MCP Ecosystem
"Jeevesus saves. Dredd judges."
Dredd MCP is a pre-invocation security check for the Model Context Protocol ecosystem. Before your agent calls a tool on any other MCP server, Dredd renders a verdict: BLOCK, ADVISORY, or ALLOW. Every verdict is HMAC-signed and cites the IOC or behavioral signal that drove the decision.
The MCP ecosystem has had no defender. Three PyPI ML packages were compromised in eight days during late April 2026. Twenty-plus MCP-named GitHub repositories were caught serving SmartLoader malware in the wild. The official MCP Registry was clean of those when we measured β but the typosquat surface is wide open.
Dredd is the layer that catches the next compromise before the malicious tool gets called.
What's New β Dependency-Graph Checking (Shai-Hulud class)
Dredd no longer stops at the named server. It walks the transitive dependency graph.
The Shai-Hulud worm taught the ecosystem the hard lesson: the malicious code is rarely in the package you installed β it's three levels down, in a transitive dependency that got its publish token stolen. A check that only vets the server you named is blind to exactly the attack that's been hitting npm and PyPI.
So every preflight now resolves the target server's full npm/pypi dependency graph and joins every transitive package against our continuously updated IOC corpus β including the OSV malicious-package feeds for npm and PyPI. If a known-malicious package is buried anywhere in the tree, Dredd blocks the call before the tool runs.
The verdict is signed (HMAC-SHA256) and now carries a dep_graph field telling you whether transitive supply-chain risk was actually evaluated for that target:
{
"verdict": "BLOCK",
"severity": "critical",
"dep_graph": { "evaluated": true, "packages_checked": 247, "malicious_transitive": 1 },
"signature": "sha256=..."
}
If the server doesn't expose a resolvable manifest, dep_graph.evaluated is false and Dredd drops to the advisory tier β it tells you it couldn't see the tree rather than pretending it's clean.
What Dredd Checks
Every preflight call evaluates these signals:
- Compromised dependency β including transitive (Shai-Hulud class). The target server's package manifest is parsed, its full npm/pypi dependency graph is resolved, and every package β direct and transitive β is joined against our continuously updated IOC corpus (Socket, Aikido, GitGuardian, ReversingLabs, Phylum, StepSecurity, Wiz, plus OSV malicious-package feeds for npm and PyPI). If the server, or anything it pulls in transitively, pins
lightning==2.6.2or any other known-compromised version, the call is blocked. Thedep_graphfield on the verdict reports whether the transitive tree was evaluated. - Tool surface drift. The list of tools the server exposes today versus the snapshot the user originally approved. New tools that appeared since the last review trigger an advisory. Mid-session rugpull is the threat model.
- Remote URL drift. The server's runtime endpoint compared against the URL it published in the registry. A server quietly calling out to a different host than the one you signed up for is a hijack signature.
- Permission escalation. A server requesting write or exec permissions it did not have last week.
The verdict comes back signed in under 200 ms (Cloudflare-edge cached, 5-minute TTL). The hook fails open by default β if our endpoint is ever down, Dredd does not brick your tooling.
Install β Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"dredd": {
"url": "https://analytics.dugganusa.com/api/v1/dredd/mcp"
}
}
}
Restart Claude Desktop. You'll see Dredd available with one tool: check_mcp_server.
Install β Cursor
Add to ~/.cursor/mcp.json:
{
"mcpServers": {
"dredd": {
"url": "https://analytics.dugganusa.com/api/v1/dredd/mcp"
}
}
}
Test from terminal
curl -X POST https://analytics.dugganusa.com/api/v1/dredd/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
You should see one tool: check_mcp_server.
The Tool
check_mcp_server
| Argument | Type | Required | Description |
|---|---|---|---|
server |
string | yes | MCP server name (e.g. io.github.foo/bar) or substring |
version |
string | no | Optional semver of the server |
tool |
string | no | Optional name of the specific tool being invoked |
Returns a JSON verdict:
{
"success": true,
"server": "io.github.foo/bar",
"version": "1.2.3",
"tool": "list_files",
"verdict": "ALLOW",
"severity": "clean",
"findings_count": 0,
"findings": [],
"dep_graph": { "evaluated": true, "packages_checked": 247, "malicious_transitive": 0 },
"checked_at": "2026-05-04T20:00:00Z",
"ttl_seconds": 300,
"signature": "sha256=..."
}
Verdict values:
| Verdict | Severity tier | What to do |
|---|---|---|
BLOCK |
critical or high |
Refuse the invocation. Do not call the target tool. |
ADVISORY |
medium or advisory |
Surface to the user; let them decide. |
ALLOW |
clean |
Proceed. |
The signature field is an HMAC-SHA256 of the canonical verdict body using a server-side secret. Hooks should verify this to defeat MITM-forged "all clear" responses (verification key distributed out of band on request).
The Public Watchtower
Real-time aggregate dashboard of every active finding across the registry β free, no auth, no email gate:
https://analytics.dugganusa.com/api/v1/dredd/watchtower.json
Returns counts by severity, recent findings, current verdict (CLEAN / WATCH / HIGH / CRITICAL).
Updated continuously as the daily fetcher + correlator pipeline runs against the registered MCP corpus.
How Dredd Works
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Your Agent (Claude Desktop / Cursor / custom) β
β calls check_mcp_server(server, version, tool)β
βββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β JSON-RPC over HTTPS
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββ
β Dredd MCP β analytics.dugganusa.com/api/v1/dredd/mcp β
β - look up findings for (server, version, tool)β
β - aggregate severity, render verdict β
β - HMAC-sign canonical verdict β
ββββββββββββββββββ¬ββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββ
β mcp_findings index β populated by β
β daily fetcher + correlator joining the β
β resolved transitive dep graph Γ IOC corpus β
β (Socket, Aikido, GitGuardian, ReversingLabs, β
β + OSV malicious-package feeds: npm & PyPI) β
ββββββββββββββββββββββββββββββββββββββββββββββββββ
The correlation cadence today is 12 hours (08:30 UTC and 20:30 UTC). When a real compromise lands in the registered-MCP corpus, cadence tightens.
Trust Posture
- HMAC-signed responses. Hook implementations should verify the
signaturefield on every verdict. - Fail-open by default. If our endpoint is down, Dredd does not brick your tooling β it returns "advisory: backend unavailable" and lets the user decide. Document override (
DREDD_BYPASS=<reason>) for critical workflows. - Read-only. Dredd never modifies your environment. Verdict only.
- No tool argument leakage. Hooks should send
(server, version, tool)only β never the contents of tool arguments. Those stay on your machine. - Validated corpus, not just a big one. The IOC corpus behind every verdict is independently checkable on four live, no-auth endpoints: novelty (
/api/v1/feed-uniqueness, ~75%+ of our IOCs aren't in ThreatFox), timeliness (/api/v1/kev-lead, live kev-lead ledger vs CISA KEV), accuracy (/api/v1/spamhaus-validation), and liveness (/api/v1/feed-efficacy, opt-in consumer reports of when our indicators actually fire on real traffic β proof the feed is operationally live, not just large). - 95% epistemic ceiling. We cap our claims at 95% per DugganUSA's epistemic humility rule. Coverage gap: about 60-70% of MCP servers in the registry today don't expose a public source repository, which means Dredd cannot inspect their dependency tree. The advisory tier exists for those.
The Family
Dredd is the 13th member of the DugganUSA defender family β and the first MCP-native member:
dugganusa-scanner-coreβ Core IOC scanning enginedugganusa-vscodeβ VS Code extensiondugganusa-splunkβ Splunk Technology Add-ondugganusa-slackβ Slack botdugganusa-raycastβ Raycast extensiondugganusa-sentinelβ Microsoft Sentinel TAXII connectordugganusa-obsidianβ Obsidian plugindugganusa-nvimβ Neovim plugindugganusa-elasticβ Elastic / OpenSearch integrationdugganusa-edge-shieldβ Cloudflare Workerdugganusa-cliβ CLI scannerdugganusa-chromeβ Chrome extensiondugganusa-actionβ GitHub Action
Companion MCP server: Jeevesus β natural-language threat intelligence search across 38M documents. Jeevesus saves. Dredd judges.
License
MIT β see LICENSE.
Support
- Watchtower dashboard: analytics.dugganusa.com/api/v1/dredd/watchtower.json
- Issues: github.com/pduggusa/dredd-mcp/issues
- DugganUSA blog: www.dugganusa.com
Built in Minneapolis. Defender-grade. Read-only. Receipts do the work.
DugganUSA Defender Family
Same threat corpus, surfaced wherever you live. Open source, MIT licensed, receipts on every repo.
| Plugin | Surface |
|---|---|
| dugganusa-scanner-core | Core IOC scanning engine |
| dugganusa-vscode | VS Code extension |
| dugganusa-splunk | Splunk Technology Add-on |
| dugganusa-slack | Slack bot |
| dugganusa-raycast | Raycast extension |
| dugganusa-sentinel | Microsoft Sentinel TAXII connector |
| dugganusa-obsidian | Obsidian plugin |
| dugganusa-nvim | Neovim plugin |
| dugganusa-elastic | Elastic / OpenSearch integration |
| dugganusa-edge-shield | Cloudflare Worker |
| dugganusa-cli | CLI scanner |
| dugganusa-chrome | Chrome extension |
| dugganusa-action | GitHub Action |
| dredd-mcp (this repo) | Pre-flight MCP security (this repo) |
Backed by the live DugganUSA threat intel platform: analytics.dugganusa.com.
Jeevesus saves. Dredd judges.
InstalaciΓ³n
AΓ±ade Dredd MCP a tu cliente. Elige el que uses.
claude mcp add --transport http dredd-mcp https://analytics.dugganusa.com/api/v1/dredd/mcpcodex mcp add dredd-mcp --url https://analytics.dugganusa.com/api/v1/dredd/mcp{
"mcpServers": {
"dredd-mcp": {
"url": "https://analytics.dugganusa.com/api/v1/dredd/mcp"
}
}
}Add to `~/.cursor/mcp.json`, or `.cursor/mcp.json` for a single project.
{
"servers": {
"dredd-mcp": {
"type": "http",
"url": "https://analytics.dugganusa.com/api/v1/dredd/mcp"
}
}
}Add to `.vscode/mcp.json` in your workspace.
{
"mcpServers": {
"dredd-mcp": {
"url": "https://analytics.dugganusa.com/api/v1/dredd/mcp"
}
}
}Add to `claude_desktop_config.json`, then restart Claude Desktop.
{
"mcpServers": {
"dredd-mcp": {
"serverUrl": "https://analytics.dugganusa.com/api/v1/dredd/mcp"
}
}
}Add to `~/.codeium/windsurf/mcp_config.json`.
PuntuaciΓ³n
39 / 100
Incompleta
- DocumentaciΓ³n25/25
- Mantenimiento13/25
- Confianza6/20
- Capacidad0/15
- InstalaciΓ³n12/15
- Documents what it does and how to connect
- Has a resolvable package or endpoint
- Exposes at least one tool, prompt or resource
- README has substantive content
- Includes a code example
- Documents its configuration
- Mentions credentials or security posture
- Last commit 119 days ago
- Has a release history
- Repository is not archived
- No licence detected
- Namespace verified in the official MCP registry
- Claimed by its owner
- Published under an organisation
- 0 tool(s) documented
- Provides prompt templates
- Provides resources
- 6 documented install method(s)
- Published to a package registry
- Offers a hosted endpoint β no local install
Historial de versiones
| Versiones | Publicada |
|---|---|
| 1.0.0Γltima | 4 may 2026 |