MCP server wrapping StyleGAN ADA CLI scripts for image generation, combination, mixing, and animation
This MCP server wraps arbitrary CLI scripts with minimal quality controls. All 5 tools share identical generic schemas with no semantic structure. Tool descriptions are single-sentence statements that lack actionable guidance, parameter constraints, or usage context. The schema is bare-bones: two generic parameters (args array, stdin string) offer no insight into what each tool actually does or what inputs it accepts. No output schema is documented. Critical security issues: the tools accept arbitrary command-line arguments, creating injection vectors. Error handling is absent, the LLM receives raw stdout/stderr from subprocess calls with no recovery guidance. No tool annotations (destructive hints, idempotent markers). The design treats all tools identically despite their different risks: show.py is read-only while generate.py, combine.py, mix.py, and animate.py perform writes. This parity masks important semantic differences that should guide agent behavior.
CLI tool for animating images
CLI tool for combining images
CLI tool for generating images with StyleGAN ADA
CLI tool for mixing images
CLI tool for showing images
All tools use identical generic schema with no semantic structure. Input schema exposes only 'args' (string array) and 'stdin' (string). No documentation of what arguments each script accepts, what constraints apply, what values are valid, or what the outputs contain. This forces the LLM to guess at tool usage.
Tool descriptions are single sentences with no actionable context. 'CLI tool for generating images with StyleGAN ADA' (15 chars below minimum 20) does not explain when to use this vs other tools, what prerequisites exist, what parameters to pass, what the output looks like, or whether the operation is idempotent/destructive. Descriptions must be 20 - 1024 chars and must address WHAT, WHEN, and CONSEQUENCES.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 24 | 2026-07-28+ | v2 |
No output schema documented. The CLIResult dataclass returns (stdout, stderr, return_code), but the tool descriptions do not specify what fields the LLM should expect, what each field contains, or what data types are returned. The LLM cannot plan downstream tool calls or extract structured data.
Command-line argument parameter ('args') accepts a free-form array of strings with no validation, enumeration, or constraints. This creates a prompt-injection vector: an LLM can be tricked into passing malicious flags or arguments. E.g., passing ['--output', '/etc/passwd'] could write to sensitive locations. No sanitization documented.
Tool names do not start with action verbs (pattern baseline: 90% of A+ tools start with verb). 'show.py', 'generate.py', 'combine.py', 'mix.py', 'animate.py' are filenames, not verb_noun tool names. Better: 'show_image', 'generate_images', 'combine_images', 'mix_images', 'animate_images'. Current names are ambiguous about what the tool does (is 'show.py' a viewer or a printer?).
No error handling guidance. When a subprocess call returns a non-zero exit code, the raw stderr is returned to the LLM with no recovery suggestions. E.g., 'Model file not found' gives no hint that the LLM should check available models or provide a path. Per pattern:recovery-guide, errors must tell the LLM what to do next.
No tool annotations (destructiveHint, readOnlyHint, idempotentHint). The metadata already marks generate.py, combine.py, mix.py, animate.py as WRITE operations, but this information is not reflected in the tool schema. Agents need to know which tools are safe to retry and which have irreversible side effects.
No parameter descriptions. The 'args' and 'stdin' parameters have brief descriptions ('Command line arguments', 'Standard input') but do not explain: which flags are supported, what values are expected, what constraints apply, whether certain flags are mutually exclusive, or what the default behavior is. An LLM cannot use these tools without trial and error.
Identical generic schema across all tools masks semantic differences. show.py is READ_ONLY, but mix.py and animate.py are WRITE operations with different risk profiles. A single generic 'args' + 'stdin' schema does not distinguish between input file paths, output paths, model parameters, etc. Each tool needs its own specific parameter schema.