Professional MCP server for annotating screenshots with markers, arrows, callouts, and more. Works seamlessly with Playwright MCP for documentation workflows.
- Multiple Annotation Types: Markers, arrows, callouts, rectangles, circles, labels, highlights, blur, connectors, and icons
- Professional Styling: Gradient markers with shadows, customizable colors and themes
- Theme Support: Pre-built themes for documentation, tutorials, bug reports, and highlights
- 6 MCP Tools: Different tools for different use cases
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{ "mcpServers": { "image-annotator": { "command": "node", "args": ["/path/to/.mcp-servers/image-annotator/server.js"] } } }cd image-annotator npm installAdd multiple annotations to a screenshot image.
Annotation Types:
marker- Numbered circles (1, 2, 3...) with gradient and shadowarrow- Straight arrows with customizable headscurved-arrow- Smooth curved arrowscallout- Text boxes with pointers (speech bubbles)rect- Rectangle highlightscircle- Circle highlightslabel- Text labels with optional backgroundshighlight- Semi-transparent overlaysblur- Blur sensitive contentconnector- Dashed lines between elementsicon- Icon badges (check, x, warning, info, question)
Themes: documentation, tutorial, bugReport, highlight
Colors: red, orange, yellow, green, blue, purple, pink, cyan, teal, white, black, gray, lightGray, darkGray, success, warning, error, info, primary, secondary, accent
Get width, height, and format of an image. Essential for calculating annotation coordinates.
Create a numbered step-by-step guide on a screenshot. Automatically places numbered markers with labels and connecting arrows.
Quickly highlight a specific area with a shape (circle, rect, highlight) and optional label.
Add a callout (speech bubble) pointing to a specific location.
Blur a rectangular area to hide sensitive information.
{ "input_path": "/path/to/screenshot.png", "annotations": [ {"type": "marker", "x": 100, "y": 100, "number": 1, "color": "primary", "size": 28}, {"type": "arrow", "from": [130, 100], "to": [200, 150], "color": "red", "strokeWidth": 3}, {"type": "label", "x": 210, "y": 155, "text": "Click here!", "background": "white", "shadow": true}, {"type": "callout", "x": 300, "y": 200, "text": "Important!", "pointer": "left", "color": "orange"}, {"type": "rect", "x": 50, "y": 250, "width": 200, "height": 100, "color": "green", "style": "dashed"}, {"type": "icon", "x": 400, "y": 100, "icon": "check", "color": "success"} ] }For accurate annotation positioning, use Playwright to get real element coordinates:
browser_navigate → browser_take_screenshot Use browser_evaluate to get bounding boxes:
() => { const el = document.querySelector('[role="tab"]'); const rect = el.getBoundingClientRect(); return { x: rect.x, y: rect.y, width: rect.width, height: rect.height }; }If screenshot is at 2x scale, multiply coordinates by 2.
{ "input_path": "/path/to/screenshot.png", "annotations": [ {"type": "marker", "x": 1010, "y": 630, "number": 1, "color": "primary"}, {"type": "callout", "x": 1010, "y": 500, "text": "Click here", "pointer": "bottom"} ] }Upload annotated image to Basecamp: basecamp_comment_with_file
# Annotate an image node annotate.js input.png output.png --annotations '[{"type":"marker","x":100,"y":100,"number":1}]' # Get image dimensions node annotate.js --dimensions input.pngMIT License - see LICENSE file.
Varun Dubey varun@wbcomdesigns.com
