Drives the live Open Screenshot Generator editor tool by tool over MCP, using osg mcp to expose the design tools (artboards, elements, backgrounds, fonts, the asset libraries, templates, App Preview…

MITAuto-check passedAgent Workflows

Install Editor Tools

skills CLI
$ npx skills add dotnetdreamer/open-screenshot-generator --skill editor-tools -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dotnetdreamer/open-screenshot-generator editor-tools --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dotnetdreamer/open-screenshot-generator.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/editor-tools .claude/skills/editor-tools && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
editor-tools
GitHub stars
124
Token cost
~3.8k tokens
SKILL.md length
2,090 words
Files
1
Skills in repo
13
Repo updated
First seen
Licence
MIT

At a glance

Drives the live Open Screenshot Generator editor tool by tool over MCP, using osg mcp to expose the design tools (artboards, elements, backgrounds, fonts, the asset libraries, templates, App Preview…

  • Works in 7 steps: list_artboards to get ids. → get_artboard on the one you are… → Make the change with the batched tool:… → …
  • Tasks that involve MCP servers
  • SKILL.md covers Starting the server, The mutation rules, The tools, by job and A session that works, plus 2 more sections
  • Calls npx

What it does

Editor Tools is an agent skill from dotnetdreamer/open-screenshot-generator. Drives the live Open Screenshot Generator editor tool by tool over MCP, using osg mcp to expose the design tools (artboards, elements, backgrounds, fonts, the asset libraries, templates, App Preview timelines, 57 locales and PNG export) to any MCP client, plus osg install to write the server entry into a detected agent config. Use this whenever someone wants to edit an existing screenshot project rather than regenerate it, asks to connect the design tools to Claude Code, Cursor, Claude Desktop or VS Code, or says…

Its SKILL.md is about 3.8k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Agent Workflows, covering MCP servers. It works with Model Context Protocol, Visual Studio Code and Tauri. The repository describes itself as: Open source Canva with CLI/GUI, AI Agent, MCP for App Store and Play Store screenshots. Free alternative to AppScreens, AppLaunchpad and Previewed. The licence is MIT.

When your agent uses it

  • Tasks that involve MCP servers

Example prompts

  • “move that headline”
  • “make the phone bigger”
  • “add an MCP server for my screenshots”
  • “/editor-tools”

Requirements

  • Node.js

Workflow steps

7 steps, taken from the first numbered list in SKILL.md.

  1. list_artboards to get ids.
  2. get_artboard on the one you are changing, to get element ids and current values.
  3. Make the change with the batched tool: add_elements for new layers, update_element for edits.
  4. measure_element if text moved or grew.
  5. export_png with scale: 0.25 and look at it.
  6. Iterate on 3 to 5.
  7. export_all with save: true when it is right.

What it can do on your machine

Read from SKILL.md and the folder at commit 556578e. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • npx

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use npx, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Editor Tools loads about 3.8k tokens when it runs. Until then it costs about 210 tokens; SKILL.md has 2,090 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~210
When it runs · the whole SKILL.md, loaded when a task matches
~3.8k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from dotnetdreamer/open-screenshot-generator at commit 556578e, republished under its MIT licence (© dotnetdreamer). 2,090 words, ~3,793 tokens.

Download SKILL.mdSave it as .claude/skills/editor-tools/SKILL.md (or your agent's skills folder).
name
editor-tools
description
Drives the live Open Screenshot Generator editor tool by tool over MCP, using `osg mcp` to expose the design tools (artboards, elements, backgrounds, fonts, the asset libraries, templates, App Preview timelines, 57 locales and PNG export) to any MCP client, plus `osg install` to write the server entry into a detected agent config. Use this whenever someone wants to edit an existing screenshot project rather than regenerate it, asks to connect the design tools to Claude Code, Cursor, Claude Desktop or VS Code, or says things like "move that headline", "make the phone bigger", "add an MCP server for my screenshots", "let me edit the design from here" or "what tools do I have". Read it before making any direct tool call, because the element, locale and export tools have asymmetries that silently do nothing if you guess.
license
MIT
metadata.package
open-screenshot-generator
metadata.homepage
https://openscrgen.app

Driving the editor: the tools, and the rules that keep them honest

The end state: an MCP client holding a live connection to the real editor, with the user's project open, making precise edits that land as real undo steps in a project file the user can open in the app afterwards.

Nothing here is a reimplementation. Every call lands in the same function a click in the UI lands in, inside the real editor page. That is why an edit you make is indistinguishable from an edit the user made by hand.

Starting the server

bash
npx -y open-screenshot-generator@0 install

install detects the agent configs on this machine and writes the server entry. Prefer it over hand editing, especially on Windows where several clients need the command wrapped.

The manual form, for a config it did not know about:

json
{
  "mcpServers": {
    "open-screenshot-generator": {
      "command": "npx",
      "args": ["-y", "open-screenshot-generator@0", "mcp", "--stdio"]
    }
  }
}

--stdio is the default and the right choice: no port, no firewall prompt, no shared secret. Use --http --port 8722 only when the client cannot spawn a process, and it then speaks Streamable HTTP at http://127.0.0.1:8722/mcp.

Two behaviours worth knowing so the server does not feel broken:

  • initialize, ping and tools/list are answered from a manifest generated at build time, with no browser at all. Every client calls tools/list at session start and paying a browser boot for a handshake would be unacceptable.
  • The browser starts on the first tools/call and stays warm for the life of the connection. So the first real call is slow and every one after it is not.

One capability exists here that no other transport has: export_png and export_all with save: true actually write files. In a browser tab that throws, because a tab cannot write to disk.

For one off calls without a client, the CLI is the same surface:

bash
npx -y open-screenshot-generator@0 call list_artboards
npx -y open-screenshot-generator@0 edit --script osg/edits.json

osg call prints the raw JSON result on stdout, so it pipes into jq. osg edit --script runs a list of calls in order, which is the quoting proof form on Windows.

The mutation rules

These are not style preferences. Each one is a way to make a call that returns success and changes nothing.

1. One call in flight, always. The tool api closes over the artboards of the render that produced it. Two mutations dispatched in the same tick both read the pre change state and the second silently clobbers the first. The CLI serializes every bridge call for exactly this reason. If you are driving the page yourself, await each response fully before sending the next. The desktop app and the web relay also put concurrent calls in one line, but a call that waits there past its time budget is refused rather than run, so a burst of parallel calls turns into errors, not speed.

2. There is one door, and it is the same door the UI uses. Every mutating tool commits through the app's single update path, which repositions the boards, writes the project, and pushes one undo entry. That is why one tool call is one Ctrl+Z, and why add_elements is strictly better than a loop of add_element: one round trip, one undo step, and nothing is added at all if any entry is rejected, so you never end up with a half built board.

3. An artboard's position is derived. It is recomputed and overwritten on every update. Authoring it does nothing. Move a board along the canvas with update_artboard index instead, 0 being leftmost.

4. x/y and width/height are not symmetric. position is written if either x or y is present, filling the missing one with 0, so update_element with only x also slams the element to y=0. size is written only when both width and height are present, so a lone width is dropped with no error at all. Always pass the pairs together.

5. An explicit null clears a property. Omitting it leaves it alone. null is the only way to remove a shadow, a fillGradient, an animation enter or exit, or a preview duration override.

6. An unknown fontFamily is rejected, not substituted. The error names the closest available families. This is deliberate: a browser silently falls back to a default serif, which looks like the design changed for no reason. list_fonts is the allowlist, filterable by script (latin, arabic, urdu, hebrew, cjk, thai, devanagari, bengali, multilingual).

7. Text does not measure the way you expect. Glyphs render at roughly 3.3x the stored fontSize and wrap inside the element box, which clips. So ~48 is a phone headline, not 96, and the real ink bounds cannot be predicted from the props. measure_element returns what the element actually occupies on the rendered canvas. Use it before aligning anything to a headline's edge.

8. Elements paint in list order, first at the back, and adding one always puts it on top. Use reorder_element to slide a background behind work you already placed, rather than rebuilding the board.

9. export_png, export_all and measure_element read the live DOM. They fail if the project is not open on screen. open_project waits two animation frames before returning for exactly this reason.

10. Upload an image once. upload_asset returns an asset:<id> reference you can pass to imageSrc or screenshotSrc as many times as you like, instead of repeating a data URL in every call. Elements keep the reference and the editor resolves it when it draws, so the bytes are stored once. A reference that does not exist is refused when you pass it, never drawn as an empty frame. Pass the whole asset:<id>, not the bare id.

11. A recording is not an asset. upload_asset probes bytes as an image and refuses a video. Screen recordings go through upload_recording and elements carry only the mediaId it returns. Prefer an http(s) URL over base64 for anything large: a request body is capped at 32 MiB.

12. Every language tool except two writes the base document. Only set_locale and the locale arguments read a per language projection. See the store-localization skill.

13. Adding a video-device, video or gesture element, or any animation, switches the whole project to the video export path. Never put one on a screenshot board.

14. delete_artboard refuses the last board. A project with zero artboards leaves the canvas stuck loading.

15. Errors come back as data. An unknown tool is a JSON-RPC -32602. A tool that rejected your arguments is a normal result with isError and a sentence saying what to do. Read the sentence, it usually names the tool to call instead.

16. Slow tools get a longer budget. export_png, export_all, apply_template, create_project_from_template, open_project, add_elements, duplicate_artboard, update_artboard, translate_locales, add_locales, upload_asset and upload_recording are allowed minutes. Everything else answers in seconds, and a hang means a dialog is open in the page.

The tools, by job

Find out what is there (start every session here)
ToolReach for it when
list_artboardsalways first. ids, names, sizes, backgrounds, element counts
get_artboardyou need the element ids and every property on one board
measure_elementyou need the true rendered bounds of text, or to check for clipping
list_projectsthe user means a different project than the open one
open_projectswitching to it. slow, and it waits for the canvas
Boards

create_artboard (width and height, or a preset id like ios-6-3, the required iPhone size at 1206x2622), duplicate_artboard, update_artboard (rename, resize, reorder), delete_artboard, set_active_artboard, set_background (solid or a two stop gradient, and a half filled gradient is refused rather than stored).

The fastest way to build a store set: build one board properly, duplicate_artboard per screen, then change only the headline and the screenshot. Rename every board, because the name becomes the exported file name and a board left as "Blank Artboard" exports as one.

Show full SKILL.md (818 more words)Show less
Elements
ToolReach for it when
add_elementsadding anything. batch, atomic, one undo step, back to front
add_elementa single element, usually inside a larger flow
update_elementchanging anything on an existing layer
delete_elementremoving one
reorder_elementfixing stacking. front, back, forward, backward, or an index
transform_elementsmoving or scaling several layers as one arrangement
group_elementstagging layers so transform_elements can target them later by groupId
align_elementslining two or more layers up on one edge of the box they span: left, center-h, right, top, middle-v, bottom
distribute_elementsevening out the gaps between three or more layers, horizontal or vertical

Types are text, shape, device, image, video-device, video, gesture. Instead of type/subType you can pass a libraryId from list_library to drop a ready made palette asset: vector shapes, arrows, blobs, waves, patterns, photos of people holding phones, store badges, flat device mockups, 3D posed devices and coloured frames. Prefixes are element:, image:, device:, device3d: and devicecolor:.

Templates and projects

list_templates (101 of them, categories screenshots, apple-watch, mac, play-feature-graphic), get_template (its fillable slots, with stable element ids), apply_template (replace every board of the project that is already open with a filled copy of the template, as one undo step, keeping the project), create_project_from_template (copy it into a new project, open it, and optionally fill text and screenshots in the same call), list_projects, open_project, rename_project (the open project's name, nothing else).

When a project is open, and the user expects the design to land in it, use apply_template: create_project_from_template starts a second project and leaves the open one behind. Both take the same texts and screenshots. A screenshot src is an asset:<id> ref (from upload_asset, or one of the screenshots the user uploaded), a data:image URL, an http(s) URL or a path on the site; anything else is refused before the template is touched. Read the warnings in the result: they name ids the template does not have and every device frame still showing the template's sample screenshot.

list_templates deliberately hides the app-preview category, because those boards play a recording. Preview work goes through list_preview_scenes and add_preview_scene.

App Preview video

list_preview_scenes, add_preview_scene, set_animation, set_preview_duration, get_preview_timeline, upload_recording, list_recordings. The full doctrine, including Apple Review Guideline 2.3.4, is in the app-preview-video skill. Two traps worth repeating here: set_animation refuses recordings and gestures (a recording starts the board, a gesture is timed by triggerTime), and an exit with no exitStart never fires.

Assets and fonts

list_library, list_fonts, upload_asset, list_assets, delete_asset.

Languages

Config: list_supported_locales, list_locales, add_locales, remove_locales, set_base_locale, set_locale. Copy: list_translations, set_localized_text, set_localized_texts, translate_locales, export_translations_csv, import_translations_csv. Design: set_locale_override, reset_locale_overrides.

Export

export_png for one board, export_all for the project in canvas order. Both take an optional locale, which switches the canvas, captures, and switches back.

While iterating, always pass scale: 0.25. A full size board is megabytes of base64 in the response and there is nothing in it your eye needs at proof time. Switch to save: true for the final delivery and get paths back instead of a wall of data.

A session that works

  1. list_artboards to get ids.
  2. get_artboard on the one you are changing, to get element ids and current values.
  3. Make the change with the batched tool: add_elements for new layers, update_element for edits.
  4. measure_element if text moved or grew.
  5. export_png with scale: 0.25 and look at it.
  6. Iterate on 3 to 5.
  7. export_all with save: true when it is right.

Do not skip step 5. You cannot see the canvas, and a design that reads correctly as JSON regularly looks wrong as an image.

Troubleshooting

A tool returned ok and nothing changed. Almost always rule 4 (a lone width), rule 12 (a locale edit that went to the base document), or a locale override on a property that is shared until detached.

"No such element." The id came from a different artboard. Element ids are unique per board, and several tools accept an artboardId precisely to disambiguate.

Everything hangs after one call. A modal is open in the page, or two mutations went out in one tick. Re-run with --verbose to see the page console.

measure_element says the element is not on screen. The project is not open. Call open_project.

The first tool call takes 20 seconds. That is the browser boot. Every later call is fast.

The export is a white board. A gradient background was written half filled somewhere. Set it again through set_background with all three of color1, color2 and angle.

A layer exports but does not show in the preview dialog, or the reverse. That is an app level renderer gap, not a tool problem. Report it rather than working around it in the design.

  • store-screenshots for the end to end pipeline these tools sit under
  • app-preview-video for the timeline and recording tools in context
  • store-localization for the 14 language tools and the overlay model
  • store-compliance for what has to be true before any of this ships

© dotnetdreamer, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/editor-tools of dotnetdreamer/open-screenshot-generator.

Open the folder on GitHubat commit 556578e

Compare with similar skills

Editor Tools next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Editor Tools compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Editor Tools this skilldotnetdreamer/open-screenshot-generator124—~3.8kAutomated safety check: PassMIT
Cao MCP Appsawslabs/cli-agent-orchestrator1.4k—~1.9kAutomated safety check: PassApache-2.0
CC Workflow Studio AI Editorbreaking-brake/cc-wf-studio5.4k—~561Automated safety check: PassCustom licence
Agnixagent-sh/agnix445—~874Automated safety check: PassApache-2.0
Claude Docs Consultantcentminmod/my-claude-code-setup2.7k—~959Automated safety check: PassMIT
Agnixagent-sh/agnix445—~563Automated safety check: PassApache-2.0

Similar skills

  • Cao MCP Apps

    awslabs/cli-agent-orchestrator

    Official

    Enable, operate, and extend CAO's MCP Apps surface — the host-rendered fleet dashboard visible inside MCP App hosts (Claude Desktop, ChatGPT, VS Code Copilot, Goose, Postman).

    1.4k GitHub stars~1.9k tokensUpdated today
    Agent WorkflowsAuto-check passed
  • CC Workflow Studio AI Editor

    breaking-brake/cc-wf-studio

    Creates and edits visual agent workflows in CC Workflow Studio through conversation, with the agent reading and writing the canvas over MCP.

    5.4k GitHub stars~561 tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Agnix

    agent-sh/agnix

    A skill your agent uses when user asks to 'lint agent configs', 'validate skills', 'check CLAUDE.md', 'validate hooks', 'lint MCP'.

    445 GitHub stars~874 tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Claude Docs Consultant

    centminmod/my-claude-code-setup

    Consult official Claude Code documentation from code.claude.com using selective fetching.

    2.7k GitHub stars~959 tokensUpdated today
    Agent WorkflowsAuto-check passed
  • Agnix

    agent-sh/agnix

    A skill your agent uses when user asks to 'lint agent configs', 'validate skills', 'check CLAUDE.md', 'validate hooks', 'lint MCP'.

    445 GitHub stars~563 tokensUpdated yesterday
    Agent WorkflowsAuto-check passed
  • Setup Context A8c

    woocommerce/woocommerce-ios

    Set up the ContextA8C MCP server for accessing Automattic internal resources (Slack, Linear, P2s, GitHub Enterprise, etc.)

    358 GitHub starsUsed in 1 repo~627 tokens
    Agent WorkflowsAuto-check: notes

More from dotnetdreamer/open-screenshot-generator

All 13 skills in this repo
  • App Preview Video

    dotnetdreamer/open-screenshot-generator

    Builds an App Store App Preview video (and a Play Store or landing page promo cut) from a screen recording of the app, using the open-screenshot-generator CLI (osg video): it starts from one of 20…

    124 GitHub stars~3.3k tokensUpdated today
    Auto-check passed
  • App Screenshots

    dotnetdreamer/open-screenshot-generator

    Drive Open Screenshot Generator headlessly (puppeteer-core + Edge) to take UI screenshots, add palette elements, upload device screenshots, export artboard PNGs, and regenerate the 3D device…

    124 GitHub stars~5.1k tokensUpdated today
    Auto-check: notes
  • Gpt4free Provider Sync

    dotnetdreamer/open-screenshot-generator

    Check the latest xtekky/gpt4free releases for provider additions/changes and decide whether Open Screenshot Generator's AI providers need the same.

    124 GitHub stars~2.3k tokensUpdated today
    Auto-check passed
  • Stock Image Assets

    dotnetdreamer/open-screenshot-generator

    Add properly licensed Adobe Stock photos to the Images palette library (e.g.

    124 GitHub stars~1.7k tokensUpdated today
    Auto-check passed
  • Store Compliance

    dotnetdreamer/open-screenshot-generator

    Checks that rendered store assets will actually be accepted, and then ships them, using the open-screenshot-generator CLI: osg verify audits the produced PNGs and MP4s against App Store and Google…

    124 GitHub stars~3k tokensUpdated today
    Auto-check passed
  • Store Localization

    dotnetdreamer/open-screenshot-generator

    Ships one screenshot design in many App Store and Play Store languages using the open-screenshot-generator CLI (osg localize): it adds store locales to an existing project, writes per language copy…

    124 GitHub stars~3.8k tokensUpdated today
    Auto-check passed

Categories

Questions about Editor Tools

What does Editor Tools do?

Drives the live Open Screenshot Generator editor tool by tool over MCP, using osg mcp to expose the design tools (artboards, elements, backgrounds, fonts, the asset libraries, templates, App Preview…. Editor Tools is an agent skill from dotnetdreamer/open-screenshot-generator. Drives the live Open Screenshot Generator editor tool by tool over MCP, using osg mcp to expose the design tools (artboards, elements, backgrounds, fonts, the asset libraries, templates, App Preview timelines, 57 locales and PNG export) to any MCP client, plus osg install to write the server entry into a detected agent config.

When should I use Editor Tools?

Editor Tools fits situations like: tasks that involve MCP servers.

How do I install Editor Tools in Claude Code?

Run `npx skills add dotnetdreamer/open-screenshot-generator --skill editor-tools -a claude-code`. Or copy the skill folder (skills/editor-tools in dotnetdreamer/open-screenshot-generator) into .claude/skills/editor-tools in your project. Claude Code loads it when a task matches its description.

How do I install Editor Tools in Codex?

Run `npx skills add dotnetdreamer/open-screenshot-generator --skill editor-tools -a codex`. Or copy the skill folder (skills/editor-tools in dotnetdreamer/open-screenshot-generator) into .agents/skills/editor-tools in your project. Codex loads it when a task matches its description.

Can I use Editor Tools in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dotnetdreamer/open-screenshot-generator --skill editor-tools -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/editor-tools, .gemini/skills/editor-tools, .github/skills/editor-tools and .opencode/skills/editor-tools in your project.

What does Editor Tools need to run?

Going by SKILL.md and its folder, Editor Tools needs the command-line tools its instructions call (npx). Our summary lists: Node.js.

Does Editor Tools access the network?

SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Editor Tools safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Editor Tools use?

Editor Tools is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Editor Tools use?

About 3.8k tokens (SKILL.md is roughly 15k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Editor Tools?

Skills that share tags, products or a category with Editor Tools: Cao MCP Apps (awslabs/cli-agent-orchestrator, 1.4k stars), CC Workflow Studio AI Editor (breaking-brake/cc-wf-studio, 5.4k stars), Agnix (agent-sh/agnix, 445 stars) and Claude Docs Consultant (centminmod/my-claude-code-setup, 2.7k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Editor Tools?

dotnetdreamer (a GitHub user) maintains it in dotnetdreamer/open-screenshot-generator, which has 124 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 7, 2026.

Source: dotnetdreamer/open-screenshot-generator on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.