PsMCP exhibits moderate definition quality with consistent naming patterns but critical gaps in parameter descriptions and output schema documentation. Tool names follow verb_noun convention (list_, open_, edit_, set_, export_, apply_, adjust_), which is good. However, 11 of 17 tools (65%) lack complete parameter descriptions, many parameters have type information but minimal or no usage guidance. Output schemas are entirely undocumented; the rubric requires documented output schemas for all tools. Error handling is absent, no recovery guidance, no error categorization, no actionable error messages visible in the source. Security is a concern: the tool set includes destructive operations (delete_layer) without confirmation patterns, and no evidence of permission gates or audit logging.
No output schemas documented for any tool. Rubric requires documented return types for 100% of production tools. LLMs cannot plan downstream calls or extract required data without knowing output structure.
Parameter descriptions are minimal or missing. For example, 'set_text_layer_size' has a 'size' parameter with only 'New font size for the layer', no guidance on valid range (0-400 pt?), units, or constraints.
Add explicit output schemas to all 17 tools. For each, document: (1) Success response structure (e.g., 'Returns {success: boolean, message: string, layer_names: string[]}'), (2) Error response structure. Use JSON Schema in server implementation and reference in descriptions.
Expand parameter descriptions to 30-100 characters each. Example: 'size' → 'Font size in points (6-400). Integer or decimal. Default: 12pt'. For layer_name: 'Name of the text layer to edit. Must exactly match the layer name in list_layers(). If multiple layers share the same name, edits the topmost layer.'
Add min/max constraints to numeric parameters in the JSON Schema. For opacity (0-100), brightness/contrast (-100 to 100), hue/saturation (-100 to 100), radius (0-100), specify using 'minimum' and 'maximum' properties in the schema, not just descriptions.
Implement error categorization and recovery guidance. Return errors with: (1) error code (e.g., 'LAYER_NOT_FOUND', 'INVALID_RANGE'), (2) human message, (3) recovery suggestion. Example: 'LAYER_NOT_FOUND: Layer "Background" not found. Available layers: Layer 1, Layer 2, Shape. Call list_layers() to see all layers.'
Add a 'confirm_delete_layer' tool or modify delete_layer to accept an optional 'dry_run' boolean parameter. Per pattern:confirmation-request, destructive ops should allow preview before execution.
Document permission scopes for each tool. Destructive tools (delete_layer) require 'write:layers'. Read tools (list_layers) require 'read:document'. Add a scope declaration: 'Requires: write:layers' in each tool description.
Score history
Overall score trend
↑ 27 points across a rubric change (v1 → v2)
49/100
Scored
Grade
Overall
Spec posture
Rubric
2026-09-22
F
49
2026-07-28+
v2
2026-03-09
F
22
-
v1
export_as_jpg
writesource verified68/100
Export the active document as a JPG to the EXPORT_DIRECTORY.
export_as_pngwritesource verified63/100
Export the active document as a PNG to the EXPORT_DIRECTORY.
list_available_psdsread onlysource verified75/100
Lists all PSD files in the designated PSD_DIRECTORY.
list_layersread onlysource verified67/100
List all layer names in the active Photoshop document.
open_photoshopwritesource verified70/100
Open Photoshop application if not already opened.
open_psd_filewritesource verified68/100
Open a PSD file from the PSD_DIRECTORY in Photoshop.
No error handling or recovery guidance visible in source. Tools that modify state (edit_text_layer, delete_layer, export_*) provide no error categorization, no guidance on retry logic, no actionable error messages.
Numeric parameters lack constraints. 'change_layer_opacity' accepts 'opacity' (0 to 100), constraint is in description only, not in schema. Rubric requires min/max bounds in schema. Same issue: 'apply_gaussian_blur_to_layer' radius, 'adjust_layer_brightness_contrast' brightness/contrast values, 'adjust_layer_hue_saturation' adjustment values.
No permission gates or scope declarations visible. Tools like delete_layer, edit_text_layer, export_as_* are not gated by permission checks. Rubric requires permission verification and scope declarations (e.g., 'requires: write:layer, requires: read:document').
layer_name parameter is ambiguous. Tools that accept layer_name (edit_text_layer, set_text_layer_size, set_layer_visibility, rename_layer, delete_layer, duplicate_layer, change_layer_opacity, set_text_position, apply_gaussian_blur_to_layer, etc.) do not clarify: is it case-sensitive? What if multiple layers have the same name? Should agents call list_layers first?
export_as_jpg 'quality' parameter (default: 100) lacks range documentation. Rubric requires 'quality (1-100)' or similar in description.
export_as_jpg
Clarify layer_name resolution strategy in descriptions and error messages. If case-sensitive, say so. If matching is fuzzy (substring), document it. If duplicates are possible, specify behavior (e.g., 'edits the topmost matching layer').
Consider grouping related numeric adjustments. Instead of separate tools, offer: 'adjust_layer_effects' accepting {layer_name, brightness, contrast, opacity, hue, saturation} with optional fields. This reduces tool count and simplifies composition.
Add audit logging: log each tool call with timestamp, layer_name (if applicable), parameter values, and result. This enables error tracking and compliance trails.
Document which tools require an active Photoshop document vs. which open one implicitly. E.g., does edit_text_layer fail if no document is open, or does it auto-open one?