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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions