Static source inference · medium confidence · detected: Logging
Deprecated protocol patterns detected
Summary
Critical deficiencies across most tools. Of 20 tools, 14 have NO visible input schemas in the source code (tools 2-15 declared only in pyproject.toml with names/descriptions but zero schema detail). Tools 1, 16, 17, 18, 19, 20 have schemas visible. Descriptions are present but many are vague and generic. No tool annotations (readOnlyHint/destructiveHint/idempotentHint). Error handling undefined. Output schemas undocumented. The server defines tools declaratively in TOML but provides no schema validation or parameter documentation for the majority of tools.
14 of 20 tools have NO visible input schemas. Tools 2-15 are declared in pyproject.toml with only names and descriptions; no parameter types, formats, or constraints are defined anywhere in the source. This violates the critical rule: 'If a tool has NO input schema at all: its schema score MUST be 0.'
No tool annotations present. None of the 20 tools declare readOnlyHint, destructiveHint, or idempotentHint. LLMs cannot distinguish which tools are safe to retry vs. which cause side effects (e.g., save_image, crop_image, rotate_image all modify state but are unmarked).
Define complete JSON Schema input definitions for all 14 tools (save_image through batch_convert) in the source code. Include types (string, integer, number, boolean), descriptions, formats, patterns, enums, and constraints for every parameter.
Expand descriptions for all tools from 30-40 chars to 100-200 chars. Follow the pattern: 'Verb what the tool does. When to use it vs. similar tools. What it returns. Any prerequisites or side effects.' Example: 'Rotate an image by a specified angle (degrees). Use this when you need to adjust image orientation without cropping. Returns the rotated image with updated dimensions. Side effect: modifies the active image in GIMP.'
Add tool annotations: mark all state-modifying tools (save_image, crop_image, rotate_image, etc.) with destructiveHint=true; mark read-only tools (load_image, get_image_info, get_help, get_performance_metrics) with readOnlyHint=true; mark idempotent operations with idempotentHint=true.
Document output schemas for all tools. For load_image, specify: {image_id: string, width: integer, height: integer, format: string, metadata?: object}. For batch_resize, specify per-item success/failure: {results: [{input_path: string, output_path: string, status: 'success'|'failed', error?: string}], total: integer, succeeded: integer, failed: integer}.
Add error handling patterns. Define error responses with actionable guidance, e.g., 'File not found: /path/to/image.jpg. Verify the path exists and you have read permissions.' Categorize errors as retryable (network timeout, temporary lock), user-fixable (invalid path, unsupported format), or fatal (out of memory).
Spec posture evidence
Inferred effective spec: <=2025-11-25.
Relies on Logging (deprecated) - log to stderr or use OpenTelemetry
Descriptions are generic and lack actionable LLM guidance. Many are single short sentences (e.g., 'Adjust brightness and contrast', 'Apply blur effect with specified method'). Per the rubric baseline (average 194 chars, p90=392), effective descriptions should explain WHAT the tool does, WHEN to use it (vs. similar tools), and what it returns. Current descriptions skip these.
No output schemas documented. The 20 tools provide no specification of what they return. LLMs cannot plan downstream calls or extract required fields (e.g., does load_image return width/height/format/thumbnail? Does batch_resize return a list of success/failure per image or a blanket success?). This blocks tool chaining.
No error handling guidance. Tools provide no recovery hints, error classification, or actionable next steps. Per the rubric, error responses must tell the LLM what to do next and categorize errors as retryable, user-fixable, or fatal. This server defines no error patterns.
Tools 2-15 are inferred/declarative only. They appear in pyproject.toml but no explicit implementation or schema registration is visible in the source code provided. Per the hard scoring rule: 'If you are inferring tool existence (not seeing explicit registration): cap that tool's overall at 50.' These are capped at their current low scores.
Parameter names in visible tools (load_image, get_help, etc.) lack suffixes that disambiguate type. E.g., 'cache_type' in clear_cache is vague. 'operation_type' in get_performance_metrics is too generic. Per the rubric, when a parameter could be an ID, name, email, or category, suffix it with the type: 'cache_type_enum' or describe the enum constraint explicitly.
No confirmation/dry-run pattern for destructive tools. Tools like crop_image, resize_image, batch_resize, and clear_cache modify or destroy data but offer no dry-run option or confirmation step. Per the rubric, irreversible operations should support confirmation to prevent agent mistakes.
Implement dry-run/confirmation for destructive tools. Add an optional 'dry_run' boolean parameter (default=false) to crop_image, resize_image, rotate_image, batch_resize, save_image, and clear_cache. When true, return what would be done without modifying state.
Constrain parameters with enums. For clear_cache, replace 'cache_type' description with an enum: enum=['all', 'results', 'metrics', 'temp']. For get_performance_metrics, add enum constraints for operation_type and time_range_hours bounds (1-8760).
Add parameter descriptions to batch operations. For batch_resize, document: 'input_paths: array of file paths to resize. output_format: target format (jpg, png, webp). max_width/max_height: max dimensions (respects aspect ratio). quality: 1-100 (default 85).'
Consider breaking tools 2-15 into a proper registration pattern in the source (e.g., a tools registry file with full Pydantic models or FastMCP decorators). This moves them from inferred to verified, lifting their scores.
Add pagination support to batch_resize and batch_convert. Include limit/offset parameters and return a total_count so agents can process large batches incrementally without context overflow.