I built an MCP server that lets Claude watermark images
I'm a solo dev and I built Markly, an image watermarking service. It
started as a web tool, then I added a REST API, and recently I built an MCP server so that Claude
can watermark images directly.
This post covers what MCP is, why I built the server, and how you can use it.
What is MCP?
MCP (Model Context Protocol) is an open standard by Anthropic that lets AI assistants connect to
external tools. When you add an MCP server to your Claude configuration, Claude gains new
capabilities - it can call your tools, pass parameters, and handle the results.
Think of it as giving Claude hands. Instead of just talking about watermarks, Claude can actually
apply them.
The problem I was solving
My workflow used to be:
- Open photo in editor
- Add text layer
- Adjust opacity, position, font
- Export
- Repeat 50 times
The API automated steps 1-4. But I still had to write the API call, manage parameters, handle the
response. MCP eliminated that too.
Setup (10 seconds)
Add this to your claude_desktop_config.json:
{
"mcpServers": {
"markly": {
"command": "npx",
"args": ["-y", "markly-mcp-server"]
}
}
}
No API key needed. The free tier works immediately.
Restart Claude, and you now have 4 new tools:
markly_watermark_text │ Add text watermark to an image markly_watermark_logo │ Overlay a logo on an image markly_batch_watermark │ Watermark up to 20 images, get a ZIP
markly_check_usage │ Check credits and rate limits
Usage examples
Once connected, just talk to Claude:
Simple text watermark:
"Add 'Copyright 2026' as a watermark to this image: https://example.com/photo.jpg"
Claude will call markly_watermark_text with sensible defaults (semi-transparent, bottom-right).
Batch with logo:
Watermark all these images with my logo.png, bottom-right corner, 20% opacity
Claude calls markly_batch_watermark, uploads your files, and returns a download link.
Iterative refinement:
Make the text bigger and move it to the center
Claude remembers the context and re-processes with adjusted parameters.
How it works under the hood
The MCP server is a TypeScript package that:
- Exposes tool definitions (name, parameters, description) via the MCP protocol
- When Claude calls a tool, the server makes an HTTP request to the Markly REST API
- The API processes the image with Imagick (text rendering, logo compositing)
- Returns the watermarked image
- The MCP server passes the result back to Claude
The REST API is also available directly if you prefer programmatic access:
curl -X POST https://www.markly.cloud/api/v1/watermark/text \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "image=@photo.jpg" \
-F "text=Copyright 2026" \
-F "position=bottom-right" \
-F "opacity=50" \
-o watermarked.jpg
Pricing
The free tier works without signup or API key. It adds a small "markly.cloud" text to the output.
For clean output, credit packs are one-time purchases begining at 5€ for 250 credits.
Credits never expire. 1 credit = 1 image processed.
Tech stack
- API: Laravel 11, PHP 8.3, Imagick, MySQL, Redis
- MCP server: TypeScript, @modelcontextprotocol/sdk
- Hosting: VPS behind Cloudflare
- Payments: Stripe Checkout (for credit packs)
Try it
- MCP server (npm): https://www.npmjs.com/package/markly-mcp-server
- GitHub: https://github.com/Whitemarmot/markly-mcp-server (MIT)
- API landing: https://www.markly.cloud/watermark-api
- MCP landing: https://www.markly.cloud/mcp-server
- API docs: https://www.markly.cloud/developers
- Web tool: https://www.markly.cloud
Top comments (0)