MCP server for retrieving VAPT, development, and deployment reports from a PostgreSQL database
Critical failures across all dimensions. All three tools have descriptions under 20 chars (hard cap rule applies). Tool names lack action verbs (vapt_reporter, development_reporter, deployment_reporter are noun-based, not verb_noun). Parameters lack type hints in function signatures (feature_name and environment have no type annotations). No input schemas visible in code, parameters are inferred from function args, not explicitly registered. SQL injection vulnerabilities in all tools (string interpolation in queries). No output schema documentation. No error handling beyond basic length checks. No pagination despite tools returning potentially large result sets.
Get Deployment report for the given application name and optional environment. If environment is not provided, get all the environments for the given application name
Get Development report for the given project name and optional feature name. If feature name is not provided, get all the features for the given project name
Get VAPT report for the given asset name
All tool descriptions are under 20 characters (hard cap rule: description score must be 0-20). Descriptions like 'Get VAPT report for the given asset name' are too terse to guide LLM selection. Expand to 50-200 chars explaining WHAT, WHEN, and WHAT IT RETURNS.
SQL injection vulnerability in all three tools. Queries use f-string interpolation (e.g., f"select * from vapt_reports s1 where asset_name = '{asset_name}'") without parameterization. Malicious asset_name values can break queries or exfiltrate data. Use parameterized queries with SQLAlchemy ORM or engine.execute(text(...), params={...}).
Tool names are noun-based (vapt_reporter, development_reporter, deployment_reporter) instead of verb_noun (get_vapt_report, get_development_report, get_deployment_report). LLMs infer intent from action verbs, noun-only names are ambiguous and fail the naming baseline (90% of A+ tools start with action verb).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 20 | 2026-07-28+ | v2 |
No input schemas visible in source code. Parameters (feature_name, environment) lack type annotations in function signatures. FastMCP may infer schemas from type hints, but code shows bare parameter names without types. Verify schema registration in FastMCP decorator output.
No output schema documentation. Tools return pd.DataFrame.to_dict(orient='records'), a list of dicts, but no schema describes field names, types, or structure. LLMs cannot plan downstream calls or extract data reliably. Document return type: e.g., 'Returns list of {asset_name: str, status: str, updated_at: ISO8601, ...}'.