Skip to content

Cisco scanner output shows hardcoded mcp.deepwiki.com URL in execution logs #383

@algis-dumbris

Description

@algis-dumbris

What happened

Opening a scan report for a local stdio server (e.g. everything-server via npx @modelcontextprotocol/server-everything) shows, in the Cisco MCP Scanner execution log section of the Web UI, a line like:

"server_url": "https://mcp.deepwiki.com/mcp"

The server being scanned has no relationship to mcp.deepwiki.com. The Cisco scanner ran fully offline (NetworkReq: false, --analyzers yara,readiness static --tools tools.json) against tool definitions exported locally. No network request to deepwiki was made. This looks alarming — users reasonably assume mcpproxy is exfiltrating tool definitions to an unrelated third-party URL.

Root cause

The upstream cisco-ai-mcp-scanner PyPI package (wrapped by docker/scanners/cisco/Dockerfile) hardcodes server_url: https://mcp.deepwiki.com/mcp as a header line in its raw-format stdout regardless of the actual scan target. mcpproxy captures scanner stdout verbatim into ScannerReport.Stdout (internal/security/scanner/types.go:154) and renders it in the scan report UI per-scanner execution logs, so the bogus string leaks through.

Our own parser parseCiscoScannerOutput in internal/security/scanner/engine.go:707 correctly ignores this field — it only reads scan_results[].tool_name and findings — so findings are unaffected. This is strictly a cosmetic / trust-regression issue.

This is already noted as a known limitation in docs/features/security-scanner-plugins.md:316:

Cisco scanner output has a hardcoded server_url header in its stdout (https://mcp.deepwiki.com/mcp). Cosmetic, does not affect findings.
…but no tracking issue existed until now.

Impact

  • False alarm for users: Security tooling must not display output that looks like it sent sensitive data to an unrelated third-party URL. Serious trust regression for a security feature.
  • Does NOT affect findings: Parser ignores the header; only the raw-output viewer surfaces it.

Reproduction

  1. Add any stdio server (e.g. everything-server via npx @modelcontextprotocol/server-everything).
  2. Enable the cisco-mcp-scanner plugin.
  3. Run a scan from the Web UI or CLI: mcpproxy security scan everything-server --scanner cisco-mcp-scanner.
  4. Open the scan report in the Web UI; expand the Cisco scanner execution log.
  5. Observe the hardcoded "server_url": "https://mcp.deepwiki.com/mcp" line.

Log evidence (scan fully offline, no deepwiki network traffic)

~/Library/Logs/mcpproxy/main.log:

2026-04-11T21:17:25.931+03:00 | INFO | scanner/source_resolver.go:1047 | Resolved source from npx cache | {"server": "everything-server", "package": "@modelcontextprotocol/server-everything", "path": "/Users/user/.npm/_npx/5b2dd62b9d0bddd4/node_modules/@modelcontextprotocol/server-everything"}

2026-04-11T21:17:35.570+03:00 | INFO | scanner/engine.go:459 | Running scanner container | {"name": "mcpproxy-scanner-cisco-mcp-scanner-everything-server-6000", "image": "ghcr.io/smart-mcp-proxy/scanner-cisco:latest", "command": ["--analyzers", "yara,readiness", "--format", "raw", "static", "--tools", "/scan/source/tools.json"]}

No network activity to mcp.deepwiki.com in any log.

Proposed fixes

Option A — Sanitize on the mcpproxy side (recommended, small, local).
Before populating ScannerReport.Stdout for the cisco-mcp-scanner scanner, strip or rewrite any server_url / deepwiki header lines in the raw output and replace with a short annotation noting that the upstream scanner hardcodes a placeholder URL. Keep the rest of the raw output intact for debugging. ~20 lines in internal/security/scanner/engine.go.

Option B — Overlay actual scan target in the UI.
In frontend/src/views/ScanReport.vue, display the actual resolved source (e.g. npx_cache: /Users/.../server-everything) prominently above each scanner's raw log, and add a warning on the Cisco section explaining the placeholder URL.

Option C — File upstream bug at cisco-ai-defense/mcp-scanner.
Report to Cisco and wait for a release. Slow, and leaves the issue visible in the meantime.

Recommendation: Option A + Option C. Option A eliminates the false alarm immediately; C fixes it at the source long-term.

Relevant files

  • internal/security/scanner/registry_bundled.go:17-36 — Cisco scanner command and flags
  • internal/security/scanner/engine.go:696-800 — Cisco output detection and parser
  • internal/security/scanner/types.go:154-155ScannerReport.Stdout / Stderr
  • docker/scanners/cisco/Dockerfile — thin wrapper around the upstream PyPI package
  • docs/features/security-scanner-plugins.md:316 — already-documented "known limitation"
  • frontend/src/views/ScanReport.vue — scan report viewer (Option B)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions