diff --git a/cmd/mcpproxy/security_cmd.go b/cmd/mcpproxy/security_cmd.go index 688f2d392..87994062c 100644 --- a/cmd/mcpproxy/security_cmd.go +++ b/cmd/mcpproxy/security_cmd.go @@ -41,8 +41,15 @@ func GetSecurityCommand() *cobra.Command { Long: `Commands for managing security scanners, scanning MCP servers, and reviewing scan results. -Security scanners run as Docker containers and analyze upstream MCP servers -for vulnerabilities, tool poisoning attacks, and other security issues. +Scanning works out of the box: the offline baseline scanner is built into +mcpproxy, runs in-process on every scan, and needs no Docker and no setup. It +analyzes tool descriptions and schemas for tool poisoning attacks (TPAs), +prompt injection, and data exfiltration. + +Deep scanners are the optional extra layer. They run as Docker containers for +source and dependency analysis (CVEs, secrets), so they need Docker plus +"deep scan" enabled — and when they are unavailable they are skipped, never +blocking the baseline verdict. Examples: mcpproxy security scanners diff --git a/docs/features/security-quarantine.md b/docs/features/security-quarantine.md index 4410d20bb..3f29420dc 100644 --- a/docs/features/security-quarantine.md +++ b/docs/features/security-quarantine.md @@ -172,6 +172,28 @@ Manage held prompts with the `quarantine_security` MCP tool: ## Managing Quarantine +### Scan a Server for TPAs (MCP) + +The `quarantine_security` tool can also run and read the TPA scan, so an agent +reviewing a held server does not have to leave for the CLI or web UI: + +```jsonc +// run the offline baseline scan (in-process, no Docker required) +{ "operation": "scan_server", "name": "github" } +// read the latest verdict + findings +{ "operation": "get_scan_report", "name": "github" } +``` + +`scan_server` answers with the verdict when the scan settles quickly, otherwise +with the job id and `"status": "scan started"` — poll `get_scan_report` for the +result. Every `list_quarantined`, `inspect_quarantined` and `inspect_tools` +response also carries a one-line `scan_status`, so a server nobody ever scanned +reads as `never scanned — run scan_server first` instead of looking clean. + +The optional Docker-based deep scanners are a separate layer: they run only when +[deep scan](/features/security-scanner-plugins) is enabled, and when they are +unavailable they are skipped without changing the baseline verdict. + ### View Quarantined Servers **Web UI:** diff --git a/frontend/src/views/Security.vue b/frontend/src/views/Security.vue index c289a6862..6467f6a03 100644 --- a/frontend/src/views/Security.vue +++ b/frontend/src/views/Security.vue @@ -7,12 +7,16 @@

Configure security scanner plugins and review scan results

-
- @@ -151,12 +155,13 @@
- -
+ +
- Docker is not running. Security scanners require Docker to analyze MCP servers. + Docker is not running, so the optional deep scanners are skipped. The built-in offline baseline scan still runs.