A FastAPI-based MCP server with intentionally vulnerable challenges demonstrating security issues in MCP implementations
This is a deliberately vulnerable training server designed to teach security anti-patterns. Tool definitions are intentionally weak: 21 tools with minimal descriptions (most under 50 chars), no input validation guidance, no error handling, and dangerous operations (execute_command, execute_python_code, file_manager with delete) exposed without permission gates or confirmation patterns. Schemas are present but sparse. No tool annotations (readOnlyHint/destructiveHint). This is appropriate for a CTF/training context but would fail production code review. Average tool score: 28/100.
Analyze a log file for patterns.
Authenticate a user with username and password.
Check the status of all system components.
Evaluate a mathematical expression and return the result
Execute a system command (restricted to safe commands only)
Execute Python code for data analysis.
Execute a shell command for system management.
Destructive operations (execute_command, execute_python_code, execute_shell_command, file_manager delete) lack confirmation patterns, permission gates, and dry-run support. No idempotentHint or destructiveHint annotations.
Descriptions are uniformly short (25 - 40 chars) and lack actionable context. No guidance on when to use each tool, prerequisites, or recovery steps. Violates pattern:tool-description baseline of 194 chars average.
No error handling guidance. Tools return bare strings without structured error classification (retryable, user-fixable, fatal). LLM cannot determine recovery strategy.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
File manager tool that can read, write, and delete files
Generate a code example in the specified language for the given task
Get company data based on the specified type.
Get a configuration value from the system
Get information about a user
Get information about a user
Get the profile information for a user.
Check the status of all system components.
Process user input and return a formatted response
Read a file from the system (restricted to safe files only)
Read a file from the public directory.
Run a system diagnostic on the specified component.
Search the company database for information.
Search for files containing a specific keyword in the public directory.
Duplicate tool names (get_user_info appears twice in challenge1). LLM cannot disambiguate which to call. Violates naming clarity baseline.
No input validation constraints documented. Parameters like 'command', 'code', 'path' accept free-form strings with no enum, regex, or length limits. Invites injection attacks and hallucinated values.