Security-hardened MCP server for reconnaissance through VPN with 5-layer defense: Kill switch + Pre-flight verification + Visual confirmation + Fail-hard curl + Network isolation
Three tools with basic descriptions and no input schemas visible. vpn_curl has a detailed description (280+ chars) explaining 5-layer security, but input parameters lack type definitions in the schema. vpn_ip and vpn_verify_kill_switch have minimal descriptions (under 50 chars). No output schemas documented. Input validation occurs in code (validate_url, validate_method) but is not reflected in formal parameter schemas. Error handling returns structured dicts but descriptions do not guide LLM recovery. Naming is clear (verb_noun pattern) but parameter documentation is absent.
Fetch URL through VPN with 5-layer security verification Security layers: 1. Gluetun kill switch (blocks all non-VPN traffic) 2. Pre-flight IP check (blocks if real IP detected) 3. Visual IP confirmation (shows VPN IP in response) 4. Fail-hard curl (fails if proxy unavailable) 5. Network isolation (MCP server shares VPN network)
Get VPN IP with security verification
Verify VPN protection is active
No input schemas visible for any tool. vpn_curl accepts 'url' and 'method' parameters but JSON Schema with type definitions is not shown in source.
vpn_ip and vpn_verify_kill_switch have descriptions under 50 characters ('Get VPN IP with security verification', 'Verify VPN protection is active').
No output schemas documented. Tools return structured dicts (success, output, error, vpn_ip, blocked) but LLMs cannot infer the response structure.
Parameter descriptions missing. 'method' parameter has a default but no description of allowed values (GET, POST, etc.). LLMs cannot infer that only ALLOWED_METHODS are valid without explicit enum or description.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 45 | 2026-07-28+ | v2 |
Error responses include emoji and narrative text but do not guide LLM recovery. E.g., '🚨 BLOCKED: Invalid URL' does not suggest next steps (e.g., 'Try a different URL' or 'Call vpn_verify_kill_switch first'). Per pattern:recovery-guide, errors must tell the LLM what to do next.