Photopea MCP Server
The Photopea MCP Server enables AI agents to perform professional image editing and graphic design tasks through Photopea (a browser-based Photoshop alternative) directly from your AI agent or terminal.
Document Management
Create new documents with custom dimensions, color mode, resolution, and background
Open images from URLs or local file paths
Get document info (name, dimensions, resolution, color mode)
Resize documents (with content resampling) and close them (with optional save)
Layer Operations
Add, delete, select, duplicate, move, and reorder layers
Set layer properties: opacity, blend mode, visibility, name, lock state
Group/ungroup layers; retrieve the full layer tree as JSON
Text & Shapes
Add and edit text layers with full styling (font, size, color, bold, italic, alignment, letter/line spacing, paragraph bounds)
Add shape layers (rectangle or ellipse) with fill color, stroke color, and stroke width
Image Editing & Effects
Place images from URLs or local paths into documents
Apply adjustments: brightness/contrast, hue/saturation, levels, curves
Apply filters: Gaussian blur, sharpen, unsharp mask, noise, motion blur
Transform layers: scale, rotate, flip
Add linear gradients to layers
Selections
Create rectangular, elliptical, or full-canvas selections
Modify selections: expand, contract, feather, or invert
Fill selections with color (with optional opacity and blend mode) or clear them
Export & Utilities
Export documents to PNG, JPG, WebP, PSD, or SVG with quality control
Load custom fonts from URLs (TTF, OTF, WOFF2) and list available fonts
Execute arbitrary Photopea JavaScript for advanced/custom operations
Undo/redo one or more actions
It integrates with Claude Code, Claude Desktop, Cursor, VS Code (Copilot), and Windsurf via the MCP protocol, enabling automated, AI-driven image workflows without manual browser interaction.
Enables AI agents to perform comprehensive image editing operations in Photopea, including document creation and management, layer manipulation (adding, reordering, grouping), text and shape editing, applying adjustments/filters (brightness, blur, sharpen, etc.), making selections, and exporting images in formats like PNG, JPG, WebP, PSD, and SVG.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Photopea MCP Serverremove the background from my headshot and add a soft shadow"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Demo
Related MCP server: Photoshop MCP Server
How It Works
graph LR
A[Agent] <-->|stdio| B[MCP Server]
B <-->|WebSocket| C[Browser]
C <-->|postMessage| D[Photopea]Your agent sends editing commands through the MCP protocol. The server translates these into Photopea JavaScript API calls and executes them via a WebSocket bridge to the browser.
Note: A browser window will open automatically on the first tool call. This is expected -- Photopea runs entirely in the browser and the server needs it to perform image editing operations.
Quick Start
claude mcp add -s user photopea -- npx -y photopea-mcp-serverThen start a new Claude Code session and ask it to edit images. The Photopea editor will open in your browser automatically on the first tool call.
Installation
Claude Code
npx (recommended):
claude mcp add -s user photopea -- npx -y photopea-mcp-serverGlobal install:
npm install -g photopea-mcp-server
claude mcp add -s user photopea -- photopea-mcp-serverClaude Desktop
Add to your Claude Desktop config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):
{
"mcpServers": {
"photopea": {
"command": "npx",
"args": ["-y", "photopea-mcp-server"]
}
}
}Cursor
Add to Cursor MCP settings (.cursor/mcp.json in your project or ~/.cursor/mcp.json globally):
{
"mcpServers": {
"photopea": {
"command": "npx",
"args": ["-y", "photopea-mcp-server"]
}
}
}VS Code (Copilot)
Add to .vscode/mcp.json in your project:
{
"servers": {
"photopea": {
"command": "npx",
"args": ["-y", "photopea-mcp-server"]
}
}
}Windsurf
Add to Windsurf MCP settings (~/.windsurf/mcp.json):
{
"mcpServers": {
"photopea": {
"command": "npx",
"args": ["-y", "photopea-mcp-server"]
}
}
}Available Tools
Document (5 tools)
Tool | Description |
| Create a new document with specified dimensions and settings |
| Open an image from a URL or local file path |
| Get active document info (name, dimensions, resolution, color mode) |
| Resize the active document (resamples content to fit) |
| Close the active document |
Layer (11 tools)
Tool | Description |
| Add a new empty art layer |
| Add a solid color fill layer |
| Delete a layer by name or index |
| Make a layer active by name or index |
| Set opacity, blend mode, visibility, name, or lock state |
| Translate a layer by x/y offset |
| Duplicate a layer with optional new name |
| Move a layer in the stack (above, below, top, bottom) |
| Group named layers into a layer group |
| Ungroup a layer group |
| Get the full layer tree as JSON |
Text & Shape (3 tools)
Tool | Description |
| Add a text layer at specified coordinates |
| Edit content or style of an existing text layer |
| Add a shape (rectangle or ellipse) |
Image & Effects (9 tools)
Tool | Description |
| Place an image from URL or local path |
| Apply brightness/contrast, hue/saturation, levels, or curves |
| Apply gaussian blur, sharpen, unsharp mask, noise, or motion blur |
| Scale, rotate, or flip a layer |
| Apply a linear gradient fill |
| Create a rectangular, elliptical, or full selection |
| Expand, contract, feather, or invert a selection |
| Fill the current selection with a color |
| Deselect the current selection |
Export & Utility (6 tools)
Tool | Description |
| Export to PNG, JPG, WebP, PSD, or SVG |
| Load a custom font from a URL (TTF, OTF, WOFF2) |
| List available fonts, with optional search filter |
| Execute arbitrary Photopea JavaScript |
| Undo one or more actions |
| Redo one or more actions |
Usage Examples
Once installed, ask your agent to perform image editing tasks:
Create a poster:
"Create a 1920x1080 document with a dark blue background, add the title 'Hello World' in white 72px Arial, and export it as a PNG to ~/Desktop/poster.png"
Edit a photo:
"Open ~/photos/portrait.jpg, increase the brightness by 30, apply a slight gaussian blur of 2px, and export as JPG to ~/Desktop/edited.jpg"
Composite images:
"Create a 1200x630 document, place ~/assets/background.png as the base layer, then place ~/assets/logo.png and move it to the top-right corner"
Batch adjustments:
"Open ~/photos/sunset.jpg, apply hue/saturation with +20 saturation, apply an unsharp mask with amount 50 and radius 2, then export as PNG"
Development
git clone https://github.com/attalla1/photopea-mcp-server.git
cd photopea-mcp-server
npm install
npm run buildCommands
Command | Description |
| Compile TypeScript to |
| Watch mode with auto-reload |
| Run unit and integration tests |
| Start the server |
Architecture
The server has four main components:
MCP Server (src/server.ts) -- Registers all 34 tools with the MCP SDK and connects via stdio transport.
WebSocket Bridge (src/bridge/websocket-server.ts) -- Manages the connection between the MCP server and the browser. Queues script execution requests and handles responses with timeouts.
Script Builder (src/bridge/script-builder.ts) -- Pure functions that translate tool parameters into Photopea JavaScript API calls. Each builder function generates a script string that Photopea can execute.
Browser Frontend (src/frontend/index.html) -- A single-page app that loads Photopea in an iframe, connects to the WebSocket bridge, and relays scripts to Photopea via postMessage. Returns results back through the WebSocket.
src/
index.ts # Entry point: HTTP server, browser launch, MCP startup
server.ts # MCP server initialization and tool registration
bridge/
websocket-server.ts # WebSocket bridge with request queue
script-builder.ts # Photopea JS code generators
types.ts # Protocol message types
tools/
document.ts # Document operations (5 tools)
layer.ts # Layer operations (11 tools)
text.ts # Text and shape operations (3 tools)
image.ts # Image, adjustment, filter operations (9 tools)
export.ts # Export and utility operations (6 tools)
utils/
file-io.ts # Local file read/write, URL fetching
platform.ts # Port discovery, browser launch
frontend/
index.html # Browser UI with Photopea iframeSecurity
The MCP server binds to
127.0.0.1(localhost only) and is not accessible from the network.The
photopea_run_scripttool executes arbitrary JavaScript inside Photopea's sandboxed iframe. It is marked as destructive and requires user approval in MCP clients that support tool annotations.File operations (
open_file,export_image,place_image) read and write files with the same permissions as the user running the server.
Known Limitations
Heavy scripts (e.g., gradients with many color steps) may cause the Photopea browser UI to become unresponsive. The operations still complete successfully in the background and exports will work as expected.
Refreshing the browser page will discard all unsaved work. Export your documents before refreshing.
Only one browser tab should be open at a time. Multiple tabs will conflict over the WebSocket connection.
The
reorder_layertool may cause the Photopea UI to become unresponsive. To avoid this, create layers in the desired order rather than reordering after creation.
Requirements
Node.js >= 18
A modern web browser (Chrome, Firefox, Edge, Safari)
License
MIT
Available Tools
34 toolsphotopea_add_fill_layerAdd Fill LayerA
Add a non-destructive solid color fill layer that covers the entire canvas. Unlike fill_selection, this creates a separate adjustment-style layer that can be toggled, recolored, or deleted without affecting other layers. Use set_layer_properties to change its opacity or blend mode.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Fill layer type (currently only 'solid' is supported) | |
| color | Yes | Fill color as hex string (e.g. #ff0000) | |
| name | No | Display name for the fill layer in the layers panel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide no safety details (destructiveHint=false), but the description clarifies the tool is non-destructive and creates an adjustment-style layer that can be toggled, recolored, or deleted without affecting others. This goes beyond annotations, fully disclosing behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first defines the primary action, second differentiates from a sibling, third suggests next steps. No redundant words, front-loaded with key purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, alternatives, and follow-up actions. It lacks explicit mention of prerequisites like an open document, but given the simplicity and context from sibling tools, it is largely complete. Minor gap regarding error handling or unsupported types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the description does not add new information about parameters beyond what the schema already provides (e.g., hex color pattern, enum for type). The description focuses on overall behavior rather than parameter details, earning a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'add' and the resource 'non-destructive solid color fill layer' that covers the entire canvas. It distinguishes from the sibling tool 'fill_selection' by explaining the different behavior, making it easy for an agent to select correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts with 'photopea_fill_selection' and advises when to use this tool (for a non-destructive layer versus a direct fill). It also directs to 'set_layer_properties' for further adjustments, providing clear guidance on usage and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_add_gradientAdd GradientA
Apply a linear gradient fill to a layer, replacing its current pixel content. The target layer must already exist — use add_layer to create one first. Colors are distributed evenly across the gradient.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) | |
| type | Yes | Gradient type (currently only 'linear' is supported) | |
| colors | Yes | Array of hex color stops distributed evenly along the gradient (minimum 2, e.g. ['#ff0000', '#0000ff']) | |
| angle | No | Gradient angle in degrees (0 = left-to-right, 90 = top-to-bottom, default 0) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the tool 'replaces its current pixel content', which implies destructive behavior. However, annotations set 'destructiveHint' to false, contradicting the description. This is a serious inconsistency, and the description does not disclose other behavioral traits beyond this contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only two sentences, each serving a purpose: stating the action and providing a usage hint. No redundant or unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters and no output schema, the description covers the main behavior and a key prerequisite. However, it lacks details about error conditions (e.g., layer locked) or the outcome (e.g., whether the gradient is applied as a fill effect or rasterized). The high schema coverage partially compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds minimal value. It mentions that colors are distributed evenly, reinforcing the schema's 'minItems: 2' and lack of stop positions. The prerequisite about layer existence is useful but already implied by the schema's required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool applies a linear gradient fill to a layer and replaces its pixel content. It uses a specific verb and resource, and the mention of 'replacing' distinguishes it from sibling tools like 'photopea_add_fill_layer' which likely add a fill as a new layer effect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a prerequisite: the target layer must already exist, and directs the user to use 'add_layer' first. It also clarifies that colors are evenly distributed. However, it does not explicitly state when not to use this tool or provide alternatives for other gradient types.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_add_layerAdd LayerA
Add a new empty layer to the active document. The new layer becomes the active layer. Use this before operations that draw onto a layer, such as fill_selection or add_gradient.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Display name for the new layer in the layers panel | |
| opacity | No | Layer opacity percentage (0 = fully transparent, 100 = fully opaque, default 100) | |
| blendMode | No | Blend mode (e.g. normal, multiply, screen, overlay, darken, lighten). Defaults to normal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are present (readOnlyHint=false, destructiveHint=false). Description adds that the new layer becomes active, which is useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no unnecessary words, front-loaded with purpose and outcome.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the tool is simple. Description gives outcome (layer added and active) and usage example. Could mention return value, but still adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description does not add further parameter details; schema already covers name, opacity, and blendMode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it adds a new empty layer to the active document and that the new layer becomes active. Distinguishes from sibling tools like photopea_add_fill_layer by specifying 'empty layer'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use this tool before operations that draw onto a layer, such as fill_selection or add_gradient. Provides direct usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_add_shapeAdd ShapeA
Add a vector shape layer (rectangle or ellipse) to the active document. The shape layer becomes the active layer. Shapes are non-destructive and can be resized with transform_layer without quality loss.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Shape type to create | |
| bounds | Yes | Shape bounds | |
| fillColor | No | Color as hex string (e.g. #ff0000) | |
| strokeColor | No | Color as hex string (e.g. #ff0000) | |
| strokeWidth | No | Stroke width in pixels | |
| name | No | Name for the shape layer |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide basic safety info (readOnlyHint=false, destructiveHint=false). The description adds behavioral details: the shape layer becomes the active layer, shapes are non-destructive and scalable. This provides useful context beyond structured fields, though it omits potential side effects like clearing selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler: first sentence states action and resource, second adds behavior. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters (nested bounds), no output schema, and moderate complexity, the description covers key aspects: what it does, result (active layer), and property (non-destructive). It does not mention prerequisites like active document or error handling, but is adequate for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the schema already explains all 6 parameters. The description does not add new meaning to parameters beyond stating the shape types. Baseline 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add a vector shape layer'), specifies the shape types ('rectangle or ellipse'), and distinguishes from sibling tools like photopea_add_fill_layer or photopea_add_text by focusing on vector shapes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (for vector shapes) and hints at advantages (non-destructive, resizable without quality loss), but does not explicitly contrast with other add tools or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_add_textAdd TextA
Add a new text layer to the active document at the specified position. The text layer becomes the active layer. Use paragraphBounds to create a text box with word wrapping, or omit for point text. Use load_font to add custom fonts, and list_fonts to find available font names.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Text content to display on the layer | |
| x | Yes | X position in pixels from the left edge of the document | |
| y | Yes | Y position in pixels from the top edge of the document | |
| font | No | Font PostScript name (e.g. ArialMT, Helvetica-Bold). Use list_fonts to find available names. | |
| size | No | Font size in points (default varies by document resolution) | |
| color | No | Color as hex string (e.g. #ff0000) | |
| alignment | No | Text alignment | |
| bold | No | Apply faux bold | |
| italic | No | Apply faux italic | |
| letterSpacing | No | Letter tracking/spacing | |
| lineHeight | No | Line height (leading) | |
| paragraphBounds | No | Paragraph text box bounds |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Disclosure that the text layer becomes active adds behavioral context beyond annotations (which are non-contradictory). No details on error handling or permission needs, but adequate for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundancy. First sentence covers purpose and side effect; second sentence adds key parameter guidance and references to sibling tools.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Completeness is high given no output schema: covers side effects, parameter behavior, and tool interdependencies. Missing mention of return value or error cases, but acceptable for a straightforward creation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond schema by explaining paragraphBounds distinction and font discovery workflow. Schema coverage is 100%, so description enhances rather than compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Add a new text layer to the active document at the specified position.' It distinguishes from siblings like edit_text and adds behavioral context (layer becomes active).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on using paragraphBounds for word wrapping vs point text, and references load_font/list_fonts for font setup. Could be more explicit about when to avoid this tool, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_apply_adjustmentApply AdjustmentA
Apply a destructive image adjustment to the active layer's pixel data. Use select_layer to target a specific layer first. Modifies pixels directly — use undo to revert if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Adjustment type: 'brightness' for brightness/contrast, 'hue_sat' for hue/saturation/lightness, 'levels' for input levels, 'curves' for tone curves | |
| settings | No | Key-value settings for the adjustment. For brightness: { brightness: -100..100, contrast: -100..100 }. For hue_sat: { hue: -180..180, saturation: -100..100, lightness: -100..100 }. For levels: { inputBlack: 0..255, inputWhite: 0..255 } |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states the adjustment is 'destructive', but the annotations have destructiveHint: false, directly contradicting the description. This contradiction undermines transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and every sentence adds value. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and two parameters, the description adequately explains the destructive behavior and undo capability. It could mention adjustment types, but the schema covers those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not discuss parameters, but the input schema covers 100% of parameter descriptions. Thus, the description adds no additional meaning beyond the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it applies a destructive image adjustment to the active layer's pixel data, which is specific and distinguishes it from sibling tools like apply_filter or add_layer. The verb 'apply adjustment' matches the title and schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises to use select_layer first to target a specific layer and mentions using undo to revert, providing clear context for when to use this tool. However, it does not explicitly state when not to use it or mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_apply_filterApply FilterA
Apply a destructive filter effect to the active layer's pixel data. Use select_layer to target a specific layer first. Modifies pixels directly — use undo to revert if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Filter type to apply to the active layer | |
| settings | No | Key-value settings for the filter. For gaussian_blur: { radius: pixels }. For unsharp_mask: { amount: 1-500, radius: 0.1-250, threshold: 0-255 }. For motion_blur: { angle: degrees, distance: pixels }. For noise: { amount: 1-100 } |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims the tool is 'destructive' while the annotation destructiveHint is false. This is a direct contradiction, making the behavior unclear. The description does mention undo, but the contradiction overrides that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a distinct purpose: what it does, prerequisite, and behavior note. Front-loaded with the core action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers key behavioral aspects (destructive, undo, layer targeting) but is undermined by the contradiction. It does not explain the return value or provide examples, but for a filter tool this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description does not need to add much. It adds context about layer targeting but no additional parameter details. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool applies a destructive filter effect to the active layer's pixel data, distinguishing it from non-destructive adjustment tools via the 'destructive' qualifier. It also specifies the prerequisite step of using select_layer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context by advising to use select_layer first, but does not explicitly state when to use this tool over alternatives like apply_adjustment. However, the destructive nature implies a use case difference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_clear_selectionClear SelectionAIdempotent
Deselect the current selection in the active document, removing the marching ants. Does not modify any pixel data. Use after fill_selection or other selection-based operations are complete.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'does not modify any pixel data,' which aligns with the destructiveHint=false annotation. While annotations already cover safety, the description adds context about the selection state, though it doesn't disclose additional behavioral traits beyond what's already in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the core purpose and then adding usage context. Every sentence adds value, with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description fully covers what the tool does and when to use it. It provides sufficient context for an AI agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters (schema coverage 100%), so the description doesn't need to add parameter meaning. Baseline 4 is appropriate as it correctly implies no arguments are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deselects the current selection and removes the marching ants. It uses a specific verb ('deselect') and resource ('selection'), and clearly distinguishes from sibling tools like make_selection and modify_selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use the tool 'after fill_selection or other selection-based operations are complete,' providing clear when-to-use guidance and indicating it does not modify pixel data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_close_documentClose DocumentADestructive
Close the active document. Set save to true to save changes before closing. Unsaved changes are discarded if save is false. The next open document becomes active, if any.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | Whether to save changes before closing (true = save first, false = discard unsaved changes) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, so the description does not need to restate. It adds value by explaining unsaved changes are discarded if save is false and that the next document becomes active, providing context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the primary action and efficiently covering key behaviors with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple close action without an output schema, the description adequately explains the behavior for both save values and the resulting state (next document active). It lacks mention of error handling but is sufficient for typical use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema description already covers the 'save' parameter. The description repeats this information and does not add new parameter-level meaning, though it does add behavioral context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Close the active document' with a specific verb and resource, distinguishing it from sibling tools like create_document or delete_layer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to set save to true or false, and notes that the next open document becomes active. However, it does not explicitly contrast with alternative actions like exporting before closing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_create_documentCreate DocumentA
Create a new blank document and make it the active document. This is typically the first step in a workflow. The document opens with a Background layer. Use open_file instead to edit an existing image.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | Document width in pixels (e.g. 1920 for full HD) | |
| height | Yes | Document height in pixels (e.g. 1080 for full HD) | |
| resolution | No | Resolution in DPI (72 for screen, 300 for print) | |
| name | No | Document name shown in the title bar | Untitled |
| mode | No | Color mode (use RGB for most workflows) | RGB |
| fillColor | No | Background fill color as hex (e.g. #ffffff for white, #000000 for black). Defaults to white if omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and destructiveHint=false. Description adds context: makes document active, opens with Background layer. No contradictions; could mention creation side effects but sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with key information front-loaded. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given high schema coverage and annotations, description covers when to use, behavior (active, background layer), and alternative. Could mention return value or confirmation, but overall complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; all parameters have descriptions. Description does not add additional meaning beyond schema, meeting baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Create a new blank document' with specific verb and resource. Explicitly distinguishes from sibling 'open_file' by saying 'Use open_file instead to edit an existing image.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'This is typically the first step in a workflow' and provides clear alternative 'Use open_file instead to edit an existing image.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_delete_layerDelete LayerADestructive
Permanently remove a layer from the active document by name or index. The next layer in the stack becomes active after deletion. Use get_layers to see available layers before deleting.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavioral context beyond annotations: 'permanently remove' clarifies destructiveness, and 'the next layer in the stack becomes active after deletion' discloses side effect. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, no superfluous information, front-loaded with action and resource.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the core behavior, side effects, and provides a reference to a sibling tool. Does not mention error handling or irreversibility explicitly, but 'permanently' implies it. Adequate for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description repeats 'by name or index' from the schema but adds no additional semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (permanently remove a layer) and the resource (layer from active document), specifying identification by name or index. It differentiates from siblings like get_layers by referencing it as a prior step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance to use get_layers before deleting to see available layers, aiding correct tool selection and invocation. Implicitly warns against arbitrary deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_duplicate_layerDuplicate LayerA
Create a copy of a layer in the active document. The duplicate becomes the active layer and is placed above the original. Use newName to distinguish the copy from the original.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) | |
| newName | No | Display name for the duplicated layer (defaults to 'original name copy') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false) indicate mutation without destruction, which the description reinforces by stating the duplicate becomes active and is placed above the original. The description adds the default naming behavior (original name copy), going beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no wasted words. It front-loads the primary action and immediately provides key behavioral details. Every sentence contributes essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple duplication operation without an output schema, the description covers the main effects (active layer, placement, naming). It could mention limitations (e.g., background layers) but is largely sufficient given low complexity and supportive annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage for both parameters. The description adds the default value for newName ('original name copy') and clarifies its purpose, which is not explicitly in the schema. This exceeds the baseline expectation for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a copy of a layer in the active document,' specifying a precise verb and resource. It further distinguishes the tool by noting that the duplicate becomes active and is placed above the original, setting it apart from other layer-manipulation tools like delete_layer or reorder_layer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers a minimal usage hint: 'Use newName to distinguish the copy from the original.' However, it does not provide explicit guidance on when to use this tool versus alternatives like add_layer, nor does it mention scenarios where duplication might be inappropriate or fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_edit_textEdit TextA
Modify the content or style of an existing text layer. Only specified properties are changed — omit parameters to keep their current values. Use get_layers to find text layer names if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) | |
| content | No | New text content to replace existing text | |
| font | No | New font PostScript name (use list_fonts to find available names) | |
| size | No | New font size in points | |
| color | No | Color as hex string (e.g. #ff0000) | |
| alignment | No | Text alignment | |
| letterSpacing | No | Letter tracking/spacing | |
| lineHeight | No | Line height (leading) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive behavior. The description adds that only specified properties are changed (omit to keep values), which is useful but does not disclose any potential side effects, permissions required, or error conditions. With annotations covering the safety profile, the description provides minimal extra context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the purpose and conditional behavior. Every sentence is necessary and no word is wasted. The structure supports quick scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, mutation) and no output schema, the description covers the core behavior and parameter interaction well. It could mention the return value or success indication, but this is minor given the standard convention of mutation tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying that omitted parameters retain current values, which is not obvious from the schema alone. This compensates beyond just repeating descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it modifies an existing text layer's content or style, distinguishing it from add_text (which creates a new text layer) and other layer modification tools. The verb 'modify' paired with 'existing text layer' provides precise action and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using get_layers to find text layer names, which is helpful context. However, it does not explicitly state that this tool only works on text layers or when not to use it (e.g., for non-text layers).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_export_imageExport ImageA
Export the active document to a file and save it to the local filesystem. The entire document is flattened and exported in the chosen format. Use create_document or open_file to set up the document before exporting.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | Output format: 'png' for lossless, 'jpg' for compressed photos, 'webp' for web, 'psd' for Photoshop, 'svg' for vector | |
| quality | No | Compression quality for JPG format only (1 = smallest file, 100 = best quality). Ignored for other formats. | |
| outputPath | Yes | Absolute local file path where the exported file will be saved (e.g. /Users/me/output.png) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that the entire document is flattened and exported to local filesystem. Annotations provide no extra safety info (all false), so description adds valuable context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The crucial detail (flattening) is front-loaded, and prerequisites are mentioned concisely.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple export tool with fully described parameters and no output schema needed (return value is implicit), the description covers all necessary context: what it does, what happens to the document, and prerequisites.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed descriptions for each parameter (format enum, quality range and format, outputPath absolute path). Description repeats 'flattened' and 'save to local filesystem' but adds no new param-specific info beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it exports the active document to a file and flattens it. Distinguishes from siblings like open_file and create_document by noting they must be used first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states to use create_document or open_file before exporting, providing clear prerequisite context. Does not specify when not to use or alternatives, but the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_fill_selectionFill SelectionA
Fill the current selection with a solid color on the active layer. Requires an active selection — use make_selection to create one first. Modifies pixel data on the active layer directly. Use clear_selection afterward to deselect.
| Name | Required | Description | Default |
|---|---|---|---|
| color | Yes | Color as hex string (e.g. #ff0000) | |
| opacity | No | Fill opacity percentage (0 = fully transparent, 100 = fully opaque, default 100) | |
| blendMode | No | Blend mode for the fill (e.g. normal, multiply, screen, overlay, darken, lighten). Defaults to normal. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly states that the tool modifies pixel data directly on the active layer. This aligns with readOnlyHint=false, and though destructiveHint=false, the description does not claim otherwise, so there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences, front-loading the primary action and providing essential context without unnecessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisites, actions, and follow-up. However, it lacks details on return values, error handling (e.g., no selection), and undoability. Given no output schema, minor gaps exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds minimal value beyond the schema's parameter descriptions. The description does not provide additional context for opacity or blendMode beyond what is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fills the current selection with a solid color on the active layer. It uses specific verbs and resources, and differentiates from sibling tools like photopea_add_fill_layer by emphasizing the need for an active selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on prerequisites (active selection, use make_selection) and post-actions (clear_selection). It does not explicitly exclude alternatives but gives clear context for when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_get_document_infoGet Document InfoARead-onlyIdempotent
Get metadata about the active document including name, width, height, resolution (DPI), layer count, and color mode. Returns JSON. Use this to check document dimensions before positioning layers or making selections.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint. The description adds value by specifying the exact fields returned and the JSON format, which goes beyond structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with front-loaded purpose and immediate usage advice. No wasted words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Without output schema, the description enumerates return fields and explicitly advises when to use. Fully sufficient for a stateless read-only retrieval tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description naturally covers all semantics. Schema coverage is 100%, and the description adds no redundant param info, meeting baseline expectations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves document metadata (name, width, height, DPI, layer count, color mode) and returns JSON. This distinctively separates it from sibling tools like photopea_get_layers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this tool to check document dimensions before positioning layers or making selections, providing clear context for when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_get_layersGet LayersARead-onlyIdempotent
Get the full layer tree of the active document as JSON. Returns an array of layer objects with name, type, index, visible, opacity, blendMode, and bounds properties. Groups contain nested children arrays. Use this to discover layer names and indices for other layer operations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true. The description adds detail about the return structure (array of layer objects with specific properties, nested children for groups), which is consistent and enhances transparency beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main action, concise with no extraneous words, and effectively conveys purpose, return details, and usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no parameters, comprehensive annotations, and an explicit description of return value structure, the description is complete. It covers what the tool does, what it returns, and how to use it in the context of sibling operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so schema coverage is 100%. The description does not need to add parameter information. Baseline for zero parameters is 4, and no additional information is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets the full layer tree as JSON, listing specific properties (name, type, index, etc.) and distinguishes from sibling tools by noting it's for discovering layer names and indices for other layer operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this to discover layer names and indices for other layer operations,' providing clear usage context. It does not mention when not to use or alternatives, but the sibling list implies this is the dedicated read-only inspection tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_group_layersGroup LayersA
Group multiple layers into a layer group (folder). Layers are specified by name — use get_layers to find layer names. Grouped layers can be ungrouped later with ungroup_layers.
| Name | Required | Description | Default |
|---|---|---|---|
| layers | Yes | Array of layer names to include in the group (use get_layers to find names) | |
| groupName | No | Display name for the group folder in the layers panel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive behavior. The description adds that layers are specified by name and that grouping is reversible. This provides context beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences that efficiently convey the purpose, method, and related tool. No unnecessary words, front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main purpose and required preparation, but could mention error handling or behavior if layers are missing or already grouped. However, for a simple grouping operation, it is mostly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds context: layers must exist and names come from 'get_layers', and the groupName is a display name. It also mentions undo capability, which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (group multiple layers into a layer group) and the resource (layers), with a specific verb 'Group' and resource 'layers'. It distinguishes itself from the sibling 'ungroup_layers' by mentioning that grouped layers can be ungrouped later.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description advises using 'get_layers' to find layer names, and mentions that grouping can be undone with 'ungroup_layers'. However, it does not explicitly state when not to use this tool or provide alternatives, but given the sibling set, it is clear this is the only grouping tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_list_fontsList FontsARead-onlyIdempotent
List available fonts in Photopea. Returns font PostScript names that can be used with add_text and edit_text.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Optional search string to filter fonts by name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is clear. The description adds that it returns PostScript names, but no additional behavioral traits beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words, front-loaded with the main purpose and immediate value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description mentions return type (PostScript names) and usage context (compatible with add_text/edit_text). Sufficient for a simple list-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the 'search' parameter described as 'Optional search string to filter fonts by name'. The description adds no extra meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List available fonts' which is a specific verb+resource. It distinguishes from siblings like photopea_load_font by specifying that it returns PostScript names usable with add_text/edit_text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage before adding or editing text to obtain correct font names, but does not explicitly state when not to use it or mention alternatives like load_font for importing fonts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_load_fontLoad FontAIdempotent
Load a custom font from a URL (TTF, OTF, or WOFF2) into Photopea. The font becomes available for add_text and edit_text. Use list_fonts to find the PostScript name after loading.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | URL to a font file (.ttf, .otf, or .woff2) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint, readOnlyHint, destructiveHint, and openWorldHint, which disclose key behavior. The description adds that the font becomes available for specific sibling tools and that list_fonts can be used afterward, which is useful context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, each serving a clear purpose: first sentence defines the action and scope, second sentence provides after-use guidance. No redundant words, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a single parameter fully described in the schema, no output schema required, and the description covers the behavioral flow (load, then use in text tools, then find name via list_fonts). This is complete for a simple font-loading operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the parameter description already specifies the file extensions. The tool description reiterates the supported formats but adds no new semantic meaning beyond the schema. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Load), the resource (custom font), the source (URL), and supported file types (TTF, OTF, WOFF2). It distinguishes from siblings by specifying the font's availability for add_text and edit_text, and mentions list_fonts as a follow-up step, differentiating it from other font-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly links to two use cases (add_text, edit_text) and directs users to list_fonts for retrieving the PostScript name. It implies when to use the tool (before text operations), but does not explicitly state when not to use it or compare to alternatives beyond list_fonts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_make_selectionMake SelectionA
Create a pixel selection region in the active document. After creating a selection, use fill_selection to fill it with color, or clear_selection to deselect. Use type 'all' to select the entire canvas, or 'rect'/'ellipse' with bounds for a specific region.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Selection shape: 'all' selects the entire canvas, 'rect' creates a rectangle, 'ellipse' creates an ellipse | |
| bounds | No | Selection region bounds in pixels. Required for 'rect' and 'ellipse' types, ignored for 'all'. | |
| feather | No | Soft edge radius in pixels for anti-aliased selection edges (0 = hard edge) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate mutation (readOnlyHint=false) but no destructive behavior. The description adds context on post-selection actions but does not disclose additional behavioral traits like whether the selection replaces or adds to existing selections. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose. Every sentence provides useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (3 params, nested bounds, enum, no output schema), the description is complete enough to guide use. It explains type options and bounds requirement, though the feather parameter is not mentioned (but schema covers it).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description adds marginal value by explaining the meaning of 'all', 'rect', and 'ellipse' types and when bounds are required. However, the schema already describes these well, so the description does not significantly enhance understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a pixel selection region in the active document,' using a specific verb and resource. It distinguishes from siblings like clear_selection and fill_selection by mentioning them as subsequent actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear guidance on when to use the tool and what to do after creating a selection (fill or clear). However, it does not explicitly state when not to use it or alternatives for different selection shapes beyond the types listed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_modify_selectionModify SelectionA
Modify the current active selection. Requires an existing selection created by make_selection. For expand, contract, and feather, the amount parameter specifies pixels. Invert swaps selected and unselected areas.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | How to modify the selection: 'expand' grows it, 'contract' shrinks it, 'feather' softens edges, 'invert' swaps selected/unselected | |
| amount | No | Modification amount in pixels (required for expand, contract, feather; ignored for invert) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-destructive behavior, and the description adds behavioral detail by explaining each action's effect (e.g., feather softens edges, invert swaps). It does not contradict annotations. It could mention reversibility or immediate application, but the provided context is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences, each serving a distinct purpose: purpose+prerequisite, parameter usage, and invert explanation. No superfluous text; front-loaded with key information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple mutation tool with no output schema, the description covers core functionality, actions, and parameter constraints. It lacks return value details (though likely void) and edge cases (e.g., empty selection), but the prerequisite mention mitigates some gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers 100% of parameters with descriptions. The description essentially repeats the schema's parameter info (pixels unit, invert ignores amount), adding no new semantic value. It is helpful but redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool modifies the current active selection, lists the four specific actions (expand, contract, feather, invert), and explicitly differentiates from sibling tools like make_selection by stating the prerequisite (requires existing selection). The verb-modifier pair is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear prerequisite (must have an existing selection from make_selection) and explains when each action is applicable (e.g., amount required for expand/contract/feather). It implies usage context but does not explicitly mention when to avoid this tool or suggest alternatives like clear_selection for removal. The prerequisite is a strong guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_move_layerMove LayerA
Translate a layer by a relative x/y offset in pixels from its current position. Positive x moves right, positive y moves down. Use get_layers to check current layer bounds, or transform_layer for scaling and rotation.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) | |
| x | Yes | Horizontal offset in pixels (positive = right, negative = left) | |
| y | Yes | Vertical offset in pixels (positive = down, negative = up) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes relative offset and pixel direction. Annotations are neutral; description adds behavior beyond them without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences, front-loaded with purpose. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, alternatives, and parameter direction. Lacks mention of return value or errors, but tool is simple and no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions. Description repeats direction info and adds context of relative offset, but doesn't significantly extend meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states 'translate a layer by a relative x/y offset', specifying verb and resource. It distinguishes from siblings like transform_layer and get_layers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends get_layers for checking bounds and transform_layer for scaling/rotation, providing clear alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_open_fileOpen FileA
Open an existing image file in Photopea as a new document. Supports PSD, PNG, JPG, WebP, SVG, and other common formats. The opened file becomes the active document. Use create_document instead to start with a blank canvas.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | URL or absolute local file path of the image to open (e.g. /Users/me/photo.psd or https://example.com/image.png) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description reveals that the opened file becomes the active document, which is a behavioral trait. No contradictions with annotations (readOnlyHint=false seems appropriate for a file open that changes active state).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each serving a distinct purpose: stating the action, listing formats, and providing behavioral context plus usage alternative. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple operation (one parameter, no output schema), the description covers all essential aspects: what it does, formats supported, behavioral effect, and alternative tool. No gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter 'source' is fully described in the input schema with example values. The tool description does not add additional meaning beyond the schema, achieving a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('open an existing image file'), the tool context ('in Photopea as a new document'), and supported formats. It distinguishes itself from the sibling 'create_document' by noting the alternative for blank canvases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides guidance on when to use this tool vs. the alternative 'create_document', helping the agent decide based on whether a blank canvas or existing file is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_place_imagePlace ImageA
Place an image into the active document from a URL or local file path. Creates a new layer with the placed image as the active layer. Use width/height to resize while preserving aspect ratio, or x/y to position the layer.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | URL or absolute local file path of the image to place | |
| x | No | X position offset in pixels from the left edge | |
| y | No | Y position offset in pixels from the top edge | |
| width | No | Resize to this width in pixels (preserves aspect ratio if only one dimension is set) | |
| height | No | Resize to this height in pixels (preserves aspect ratio if only one dimension is set) | |
| name | No | Display name for the placed layer in the layers panel |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that it creates a new layer and sets it as active, which is consistent with annotations (readOnlyHint=false). It adds behavioral context beyond the minimal annotations, though it doesn't mention edge cases like invalid sources.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-load the core purpose and key parameter usage. No extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and complete schema coverage, the description covers the main usage (placement, resize, position). It lacks details on error handling or document requirements, but is adequate for an image placement tool with minimal annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%. The description adds value by explaining that width/height preserve aspect ratio and x/y position the layer, which supplements the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it places an image into the active document, creating a new layer. It differentiates from siblings like photopea_add_layer (empty layer) or photopea_open_file (opens as document).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives parameter usage hints but does not explicitly state when to use this tool versus alternatives like photopea_add_layer or photopea_open_file. No when/not-when guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_redoRedoADestructive
Redo one or more previously undone actions in the active document. Only available after using undo — the redo history is cleared when new actions are performed.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Number of history steps to redo (default 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond annotations: it explains that redo history is cleared by new actions, which is not in annotations. Annotations already indicate destructiveHint=true, so description complements well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, concise, front-loaded, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers purpose, constraints, and behavior fully. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the 'steps' parameter with default and constraints. The description adds no additional meaning beyond the schema. With 100% coverage, baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool redoes previously undone actions in the active document, distinguishing it from undo and other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states it is only available after undo and that redo history is cleared by new actions, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_reorder_layerReorder LayerA
Move a layer to a new position in the layer stack. Use 'top' or 'bottom' to move to the ends of the stack, or 'above'/'below' to shift one position relative to the current index. Use get_layers to see the current layer order.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) | |
| position | Yes | Target position: 'top' = front of stack, 'bottom' = back of stack, 'above' = one position up, 'below' = one position down |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations providing behavioral hints, the description bears full responsibility. It explains the positional options but does not disclose error behavior (e.g., invalid target) or side effects on other layers. This is adequate but not fully transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences. The first sentence states the core action. The second sentence provides useful guidance on using 'get_layers' and explains the position options. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the description is sufficiently complete. It covers the main operation and the parameter semantics. However, it could mention if group layers are affected or any prerequisites, but overall it enables correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions. The description adds value by summarizing the position options and their meanings, which helps clarify usage beyond the raw schema enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool moves a layer to a new position in the stack. It uses specific verbs and resources. However, it does not distinguish itself from the sibling tool 'move_layer', which could cause confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a helpful suggestion to use 'get_layers' to see the current order, but it lacks explicit guidance on when to use this tool versus other layer reordering tools or alternatives. No when-not or exclusion criteria are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_resize_documentResize DocumentA
Resize the active document canvas to new pixel dimensions, resampling all layer content to fit. This is a destructive operation — all layers are scaled proportionally. Use undo to revert if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| width | Yes | New document width in pixels | |
| height | Yes | New document height in pixels |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims the operation is destructive ('This is a destructive operation'), but the annotations explicitly set destructiveHint to false. This is a contradiction, making the description misleading about the tool's safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences that convey purpose, behavior, and a usage hint. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool, the description covers the main behavioral aspects: canvas resize, proportional scaling of all layers, and ability to undo. It lacks details on resampling method or cropping behavior, but overall sufficiently complete given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage with descriptions for width and height. The description does not add additional meaning beyond what the schema provides, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'resize' and the resource 'active document canvas', with specific details on pixel dimensions and resampling. It effectively distinguishes from sibling tools like transform_layer which operate on individual layers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for usage: it's for resizing the entire document canvas, scaling all layers. It mentions that it's destructive and suggests using undo. However, it does not explicitly state when not to use it or mention alternatives like transform_layer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_run_scriptRun ScriptADestructive
Execute arbitrary Photopea/ExtendScript JavaScript in the Photopea environment. Use this for advanced operations not covered by other tools. Has full access to the Photopea DOM (app, activeDocument, layers). Use with caution — scripts can modify or delete any document data.
| Name | Required | Description | Default |
|---|---|---|---|
| script | Yes | Photopea JavaScript code to execute. Must call app.echoToOE(result) to return data. Has access to the full Photopea scripting API (app, activeDocument, etc.). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds context beyond annotations by detailing full access to the Photopea DOM and the requirement to call app.echoToOE to return data, aligning with the destructiveHint annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the core purpose, and every sentence adds necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description explains the return mechanism and covers all behavioral aspects, making it complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the description adds value by explaining the need for app.echoToOE to return data and the full scripting API access, beyond the schema's description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it executes arbitrary JavaScript in the Photopea environment, and distinguishes itself from sibling tools by noting it is for advanced operations not covered by other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use (advanced operations not covered by other tools) and warns caution due to full access and destructive potential, providing clear guidance for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_select_layerSelect LayerAIdempotent
Set a layer as the active layer by name or index. Many tools (apply_filter, apply_adjustment, fill_selection) operate on the active layer — use this to target a specific layer first. Use get_layers to find layer names and indices.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-readOnly and idempotent. The description adds that it sets the active layer state, but doesn't elaborate on side effects or state changes beyond what annotations imply. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with front-loaded purpose. No unnecessary words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity (one parameter, no output), the description covers the tool's purpose, usage context, and input sourcing. Could mention that it modifies document state, but annotations cover that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and description echoes 'by name or index'. No new semantics beyond the schema's parameter description. Baseline score for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool sets a layer as active by name or index, with a specific verb and resource. Distinguishes its role from siblings by noting that many other tools operate on the active layer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use the tool (before operations that depend on active layer) and mentions get_layers to find valid inputs. Provides clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_set_layer_propertiesSet Layer PropertiesA
Update one or more properties on a layer. Only specified properties are changed; others remain at their current values. Use get_layers to inspect current property values before modifying.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) | |
| opacity | No | Layer opacity percentage (0 = fully transparent, 100 = fully opaque) | |
| blendMode | No | Blend mode (e.g. normal, multiply, screen, overlay, darken, lighten, color-dodge, color-burn) | |
| visible | No | Layer visibility (true = visible, false = hidden) | |
| name | No | New display name for the layer | |
| locked | No | Whether the layer is locked (true = prevent edits, false = allow edits) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes that only specified properties change, others remain. No contradiction with annotations (readOnlyHint false matches mutation). No side effects or limits described, but sufficient for a simple update.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-structured sentences. Front-loaded with purpose and partial update behavior. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Satisfies needs for a 6-param tool with no output schema. Provides clear purpose, partial update, and inspection hint. Could mention active document, but not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3). Description adds 'Only specified properties are changed; others remain' which clarifies partial update semantics beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Update one or more properties on a layer' with specific verb and resource. Distinguishes from siblings by hinting at inspection via get_layers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using get_layers before modifying to inspect current values. Provides clear context for when to use this tool versus the inspection tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_transform_layerTransform LayerA
Scale, rotate, or flip a layer in-place. Modifies the layer's pixel data destructively. Use get_layers to check current layer bounds before transforming, and undo to revert if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Layer name (string) or index (number) | |
| scaleX | No | Horizontal scale factor (1.0 = no change, 0.5 = half size, 2.0 = double size) | |
| scaleY | No | Vertical scale factor (1.0 = no change, 0.5 = half size, 2.0 = double size) | |
| rotation | No | Rotation angle in degrees (positive = clockwise, negative = counter-clockwise) | |
| flipH | No | Flip the layer horizontally (mirror left-right) | |
| flipV | No | Flip the layer vertically (mirror top-bottom) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states 'Modifies the layer's pixel data destructively,' but annotations set destructiveHint to false. This contradiction undermines transparency, as per the scoring rule for annotation contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences: the first defines the core action, and the second provides usage tips. No redundant information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately covers the purpose, destructive nature, pre-use check, and undo capability. However, it lacks details about immediate application and potential effects on layers beyond pixel data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all 6 parameters with clear descriptions, achieving 100% coverage. The description adds no further parameter details, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the tool's purpose: scaling, rotating, or flipping a layer in-place. It explicitly states the operation is destructive, distinguishing it from other layer manipulation tools like move_layer or set_layer_properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides actionable guidance by suggesting using get_layers to check bounds before transforming and using undo to revert. However, it does not explicitly mention when not to use this tool or compare it to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_undoUndoADestructive
Undo one or more recent actions in the active document. Each step reverses one operation from the history. Use after destructive operations (apply_filter, apply_adjustment, fill_selection) to revert changes.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | No | Number of history steps to undo (default 1) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false. The description adds that each step reverses one history operation, which is expected. No contradiction, but limited additional insight beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. Front-loaded with the main action and purpose, followed by usage guidance. Every sentence is valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and clear annotations, the description is complete. It explains what it does, when to use it, and how many steps it affects. No missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with a clear description for 'steps'. The description reiterates the concept but adds no new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Undo one or more recent actions in the active document' with a specific verb and resource. It distinguishes from sibling tools like 'photopea_redo' and explicitly mentions use after destructive operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('Use after destructive operations') and lists examples. It does not provide negative guidance but is sufficient for this simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photopea_ungroup_layersUngroup LayersA
Dissolve a layer group, moving all child layers to the document root. The group folder is removed but its contents are preserved. Use get_layers to find group names.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Name of the layer group to ungroup (use get_layers to find group names) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds detail beyond annotations: it states the group folder is removed but contents are preserved. Annotations show destructiveHint=false, which aligns with 'contents preserved'. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The most critical information is front-loaded: the action and its effect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter operation, the description covers purpose, effect, and prerequisite (use get_layers). No output schema, but results are straightforward. Could mention undo capability, but not essential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the single required parameter 'target' with a clear description. The tool description adds no new param details beyond referencing 'get_layers', but schema coverage is 100%, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Dissolve') and clearly states the resource ('layer group') and its effect ('moving all child layers to the document root'). It distinguishes from sibling tools like 'group_layers' and 'delete_layer'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the use case (dissolving a group) and recommends using 'get_layers' to find group names. While it doesn't mention when to avoid this tool or provide alternatives, the context is clear for a simple operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
27 tool updates
v0.1.1- Changed
photopea_add_fill_layer3 fields changed- changed
Input schema / properties / color / descriptionPrevious value: -"Fill color as hex"New value: +"Fill color as hex string (e.g. #ff0000)" - changed
Input schema / properties / name / descriptionPrevious value: -"Name for the fill layer"New value: +"Display name for the fill layer in the layers panel" - changed
Input schema / properties / type / descriptionPrevious value: -"Fill type: solid"New value: +"Fill layer type (currently only 'solid' is supported)"
- Changed
photopea_add_gradient3 fields changed- changed
Input schema / properties / angle / descriptionPrevious value: -"Gradient angle in degrees"New value: +"Gradient angle in degrees (0 = left-to-right, 90 = top-to-bottom, default 0)" - changed
Input schema / properties / colors / descriptionPrevious value: -"Array of hex color stops (minimum 2)"New value: +"Array of hex color stops distributed evenly along the gradient (minimum 2, e.g. ['#ff0000', '#0000ff'])" - changed
Input schema / properties / type / descriptionPrevious value: -"Gradient type"New value: +"Gradient type (currently only 'linear' is supported)"
- Changed
photopea_add_layer3 fields changed- changed
Input schema / properties / blendMode / descriptionPrevious value: -"Blend mode (e.g. normal, multiply, screen, overlay)"New value: +"Blend mode (e.g. normal, multiply, screen, overlay, darken, lighten). Defaults to normal." - changed
Input schema / properties / name / descriptionPrevious value: -"Name for the new layer"New value: +"Display name for the new layer in the layers panel" - changed
Input schema / properties / opacity / descriptionPrevious value: -"Layer opacity (0-100)"New value: +"Layer opacity percentage (0 = fully transparent, 100 = fully opaque, default 100)"
- Changed
photopea_add_shape1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Shape type"New value: +"Shape type to create"
- Changed
photopea_add_text5 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"Text content to display"New value: +"Text content to display on the layer" - changed
Input schema / properties / font / descriptionPrevious value: -"Font name (e.g. Arial)"New value: +"Font PostScript name (e.g. ArialMT, Helvetica-Bold). Use list_fonts to find available names." - changed
Input schema / properties / size / descriptionPrevious value: -"Font size in points"New value: +"Font size in points (default varies by document resolution)" - changed
Input schema / properties / x / descriptionPrevious value: -"X position in pixels"New value: +"X position in pixels from the left edge of the document" - changed
Input schema / properties / y / descriptionPrevious value: -"Y position in pixels"New value: +"Y position in pixels from the top edge of the document"
- Changed
photopea_apply_adjustment2 fields changed- changed
Input schema / properties / settings / descriptionPrevious value: -"Adjustment settings (e.g. { brightness: 20, contrast: 10 })"New value: +"Key-value settings for the adjustment. For brightness: { brightness: -100..100, contrast: -100..100 }. For hue_sat: { hue: -180..180, saturation: -100..100, lightness: -100..100 }. For levels: { inputBlack: 0..255, inputWhite: 0..255 }" - changed
Input schema / properties / type / descriptionPrevious value: -"Adjustment type"New value: +"Adjustment type: 'brightness' for brightness/contrast, 'hue_sat' for hue/saturation/lightness, 'levels' for input levels, 'curves' for tone curves"
- Changed
photopea_apply_filter2 fields changed- changed
Input schema / properties / settings / descriptionPrevious value: -"Filter settings (e.g. { radius: 5 })"New value: +"Key-value settings for the filter. For gaussian_blur: { radius: pixels }. For unsharp_mask: { amount: 1-500, radius: 0.1-250, threshold: 0-255 }. For motion_blur: { angle: degrees, distance: pixels }. For noise: { amount: 1-100 }" - changed
Input schema / properties / type / descriptionPrevious value: -"Filter type"New value: +"Filter type to apply to the active layer"
- Changed
photopea_close_document1 field changed- changed
Input schema / properties / save / descriptionPrevious value: -"Whether to save changes before closing"New value: +"Whether to save changes before closing (true = save first, false = discard unsaved changes)"
- Changed
photopea_create_document6 fields changed- changed
Input schema / properties / fillColor / descriptionPrevious value: -"Background fill color as hex (e.g. #ffffff)"New value: +"Background fill color as hex (e.g. #ffffff for white, #000000 for black). Defaults to white if omitted." - changed
Input schema / properties / height / descriptionPrevious value: -"Document height in pixels"New value: +"Document height in pixels (e.g. 1080 for full HD)" - changed
Input schema / properties / mode / descriptionPrevious value: -"Color mode"New value: +"Color mode (use RGB for most workflows)" - changed
Input schema / properties / name / descriptionPrevious value: -"Document name"New value: +"Document name shown in the title bar" - changed
Input schema / properties / resolution / descriptionPrevious value: -"Resolution in DPI (default 72)"New value: +"Resolution in DPI (72 for screen, 300 for print)" - changed
Input schema / properties / width / descriptionPrevious value: -"Document width in pixels"New value: +"Document width in pixels (e.g. 1920 for full HD)"
- Changed
photopea_duplicate_layer1 field changed- changed
Input schema / properties / newName / descriptionPrevious value: -"Name for the duplicated layer"New value: +"Display name for the duplicated layer (defaults to 'original name copy')"
- Changed
photopea_edit_text2 fields changed- changed
Input schema / properties / content / descriptionPrevious value: -"New text content"New value: +"New text content to replace existing text" - changed
Input schema / properties / font / descriptionPrevious value: -"New font name"New value: +"New font PostScript name (use list_fonts to find available names)"
- Changed
photopea_export_image3 fields changed- changed
Input schema / properties / format / descriptionPrevious value: -"Export format"New value: +"Output format: 'png' for lossless, 'jpg' for compressed photos, 'webp' for web, 'psd' for Photoshop, 'svg' for vector" - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Local file path where the export should be saved"New value: +"Absolute local file path where the exported file will be saved (e.g. /Users/me/output.png)" - changed
Input schema / properties / quality / descriptionPrevious value: -"JPEG quality (1-100, only for jpg)"New value: +"Compression quality for JPG format only (1 = smallest file, 100 = best quality). Ignored for other formats."
- Changed
photopea_fill_selection2 fields changed- changed
Input schema / properties / blendMode / descriptionPrevious value: -"Blend mode for the fill"New value: +"Blend mode for the fill (e.g. normal, multiply, screen, overlay, darken, lighten). Defaults to normal." - changed
Input schema / properties / opacity / descriptionPrevious value: -"Fill opacity (0-100)"New value: +"Fill opacity percentage (0 = fully transparent, 100 = fully opaque, default 100)"
- Changed
photopea_group_layers2 fields changed- changed
Input schema / properties / groupName / descriptionPrevious value: -"Name for the group"New value: +"Display name for the group folder in the layers panel" - changed
Input schema / properties / layers / descriptionPrevious value: -"Array of layer names to include in the group"New value: +"Array of layer names to include in the group (use get_layers to find names)"
- Changed
photopea_make_selection7 fields changed- changed
Input schema / properties / bounds / descriptionPrevious value: -"Selection bounds (ignored for 'all' type)"New value: +"Selection region bounds in pixels. Required for 'rect' and 'ellipse' types, ignored for 'all'." - changed
Input schema / properties / bounds / properties / height / descriptionPrevious value: -"Selection height"New value: +"Selection height in pixels" - changed
Input schema / properties / bounds / properties / width / descriptionPrevious value: -"Selection width"New value: +"Selection width in pixels" - changed
Input schema / properties / bounds / properties / x / descriptionPrevious value: -"Left edge X"New value: +"Left edge X position in pixels" - changed
Input schema / properties / bounds / properties / y / descriptionPrevious value: -"Top edge Y"New value: +"Top edge Y position in pixels" - changed
Input schema / properties / feather / descriptionPrevious value: -"Feather radius in pixels"New value: +"Soft edge radius in pixels for anti-aliased selection edges (0 = hard edge)" - changed
Input schema / properties / type / descriptionPrevious value: -"Selection type"New value: +"Selection shape: 'all' selects the entire canvas, 'rect' creates a rectangle, 'ellipse' creates an ellipse"
- Changed
photopea_modify_selection2 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Modification action"New value: +"How to modify the selection: 'expand' grows it, 'contract' shrinks it, 'feather' softens edges, 'invert' swaps selected/unselected" - changed
Input schema / properties / amount / descriptionPrevious value: -"Amount in pixels (for expand, contract, feather)"New value: +"Modification amount in pixels (required for expand, contract, feather; ignored for invert)"
- Changed
photopea_move_layer2 fields changed- changed
Input schema / properties / x / descriptionPrevious value: -"Horizontal offset in pixels"New value: +"Horizontal offset in pixels (positive = right, negative = left)" - changed
Input schema / properties / y / descriptionPrevious value: -"Vertical offset in pixels"New value: +"Vertical offset in pixels (positive = down, negative = up)"
- Changed
photopea_open_file1 field changed- changed
Input schema / properties / source / descriptionPrevious value: -"URL or local file path to open"New value: +"URL or absolute local file path of the image to open (e.g. /Users/me/photo.psd or https://example.com/image.png)"
- Changed
photopea_place_image6 fields changed- changed
Input schema / properties / height / descriptionPrevious value: -"Resize to this height in pixels"New value: +"Resize to this height in pixels (preserves aspect ratio if only one dimension is set)" - changed
Input schema / properties / name / descriptionPrevious value: -"Name for the placed layer"New value: +"Display name for the placed layer in the layers panel" - changed
Input schema / properties / source / descriptionPrevious value: -"URL or local file path of image to place"New value: +"URL or absolute local file path of the image to place" - changed
Input schema / properties / width / descriptionPrevious value: -"Resize to this width in pixels"New value: +"Resize to this width in pixels (preserves aspect ratio if only one dimension is set)" - changed
Input schema / properties / x / descriptionPrevious value: -"X position offset"New value: +"X position offset in pixels from the left edge" - changed
Input schema / properties / y / descriptionPrevious value: -"Y position offset"New value: +"Y position offset in pixels from the top edge"
- Changed
photopea_redo1 field changed- changed
Input schema / properties / steps / descriptionPrevious value: -"Number of redo steps (default 1)"New value: +"Number of history steps to redo (default 1)"
- Changed
photopea_reorder_layer1 field changed- changed
Input schema / properties / position / descriptionPrevious value: -"Target position in layer stack"New value: +"Target position: 'top' = front of stack, 'bottom' = back of stack, 'above' = one position up, 'below' = one position down"
- Changed
photopea_resize_document2 fields changed- changed
Input schema / properties / height / descriptionPrevious value: -"New height in pixels"New value: +"New document height in pixels" - changed
Input schema / properties / width / descriptionPrevious value: -"New width in pixels"New value: +"New document width in pixels"
- Changed
photopea_run_script1 field changed- changed
Input schema / properties / script / descriptionPrevious value: -"JavaScript code to execute in Photopea"New value: +"Photopea JavaScript code to execute. Must call app.echoToOE(result) to return data. Has access to the full Photopea scripting API (app, activeDocument, etc.)."
- Changed
photopea_set_layer_properties5 fields changed- changed
Input schema / properties / blendMode / descriptionPrevious value: -"Blend mode (e.g. normal, multiply, screen, overlay)"New value: +"Blend mode (e.g. normal, multiply, screen, overlay, darken, lighten, color-dodge, color-burn)" - changed
Input schema / properties / locked / descriptionPrevious value: -"Whether the layer is locked"New value: +"Whether the layer is locked (true = prevent edits, false = allow edits)" - changed
Input schema / properties / name / descriptionPrevious value: -"New layer name"New value: +"New display name for the layer" - changed
Input schema / properties / opacity / descriptionPrevious value: -"Layer opacity (0-100)"New value: +"Layer opacity percentage (0 = fully transparent, 100 = fully opaque)" - changed
Input schema / properties / visible / descriptionPrevious value: -"Layer visibility"New value: +"Layer visibility (true = visible, false = hidden)"
- Changed
photopea_transform_layer5 fields changed- changed
Input schema / properties / flipH / descriptionPrevious value: -"Flip horizontally"New value: +"Flip the layer horizontally (mirror left-right)" - changed
Input schema / properties / flipV / descriptionPrevious value: -"Flip vertically"New value: +"Flip the layer vertically (mirror top-bottom)" - changed
Input schema / properties / rotation / descriptionPrevious value: -"Rotation in degrees (clockwise)"New value: +"Rotation angle in degrees (positive = clockwise, negative = counter-clockwise)" - changed
Input schema / properties / scaleX / descriptionPrevious value: -"Horizontal scale factor (1.0 = 100%)"New value: +"Horizontal scale factor (1.0 = no change, 0.5 = half size, 2.0 = double size)" - changed
Input schema / properties / scaleY / descriptionPrevious value: -"Vertical scale factor (1.0 = 100%)"New value: +"Vertical scale factor (1.0 = no change, 0.5 = half size, 2.0 = double size)"
- Changed
photopea_undo1 field changed- changed
Input schema / properties / steps / descriptionPrevious value: -"Number of undo steps (default 1)"New value: +"Number of history steps to undo (default 1)"
- Changed
photopea_ungroup_layers1 field changed- changed
Input schema / properties / target / descriptionPrevious value: -"Name of the layer group to ungroup"New value: +"Name of the layer group to ungroup (use get_layers to find group names)"
34 tool updates
v0.1.0- First observed
photopea_add_fill_layer - First observed
photopea_add_gradient - First observed
photopea_add_layer - First observed
photopea_add_shape - First observed
photopea_add_text - First observed
photopea_apply_adjustment - First observed
photopea_apply_filter - First observed
photopea_clear_selection - First observed
photopea_close_document - First observed
photopea_create_document - First observed
photopea_delete_layer - First observed
photopea_duplicate_layer - First observed
photopea_edit_text - First observed
photopea_export_image - First observed
photopea_fill_selection - First observed
photopea_get_document_info - First observed
photopea_get_layers - First observed
photopea_group_layers - First observed
photopea_list_fonts - First observed
photopea_load_font - First observed
photopea_make_selection - First observed
photopea_modify_selection - First observed
photopea_move_layer - First observed
photopea_open_file - First observed
photopea_place_image - First observed
photopea_redo - First observed
photopea_reorder_layer - First observed
photopea_resize_document - First observed
photopea_run_script - First observed
photopea_select_layer - First observed
photopea_set_layer_properties - First observed
photopea_transform_layer - First observed
photopea_undo - First observed
photopea_ungroup_layers
TDQS
Scored across 34 tools
Most tools have clearly distinct purposes, but apply_adjustment and apply_filter are easily confused (both destructively modify the active layer's pixels), and add_layer vs add_fill_layer could be ambiguous without close reading. Overall, intentional pairs like make/modify/fill/clear_selection are well-differentiated.
All 34 tools follow the photopea_verb_noun snake_case pattern. Minor synonym variations (get vs list, create vs add) are consistent in style and do not break the overall predictable naming convention.
34 tools substantially exceeds the 25+ threshold for a heavy tool set. While the image editing domain is broad, many tools (e.g., add_layer/add_fill_layer, apply_adjustment/apply_filter) could be consolidated into parameterized operations without losing capability.
The tool surface covers document lifecycle, layer manipulation, text and shapes, selections, adjustments, filters, fonts, export, undo/redo, and scripting. Common operations like crop or rotating the canvas are missing, but core workflows are fully covered and run_script provides an escape hatch.
Maintenance
Related MCP Connectors
Image & PDF tools for AI agents: compress, convert, resize, PDF, AI vision, pipeline.
Agent-Native design tool - create and edit visual designs with agent assistance
LLM chat, text tools, image generation, editing, batch image jobs, and asynchronous video generation
Video, audio, and image processing for AI agents: convert, transcribe, upscale - 150+ operations.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to perform GIMP-style image operations such as open, resize, crop, flip, rotate, blur, desaturate, text overlay, export, and batch processing via MCP tools, supporting both mock (Pillow) and live GIMP backends.1MIT
- AlicenseBqualityAmaintenanceEnables AI assistants to control Adobe Photoshop programmatically, supporting recipe workflows, state awareness, and generative AI features through natural language commands.201197,307 npm479MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to generate and compose thumbnails using tools like get_capabilities, measure, render_thumbnail, render_variants, and get_canvas, with a document model that supports layers, effects, and masking.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to control Adobe Photoshop programmatically through natural language, with state awareness, recipe tools, and a standalone UI.7,307 npmMIT