<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Whitemarmot</title>
    <description>The latest articles on Forem by Whitemarmot (@whitemarmot).</description>
    <link>https://forem.com/whitemarmot</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3805853%2F29751838-baae-4530-ab37-535744440f05.png</url>
      <title>Forem: Whitemarmot</title>
      <link>https://forem.com/whitemarmot</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/whitemarmot"/>
    <language>en</language>
    <item>
      <title>I built an MCP server that lets Claude watermark images - here's how</title>
      <dc:creator>Whitemarmot</dc:creator>
      <pubDate>Wed, 04 Mar 2026 13:20:22 +0000</pubDate>
      <link>https://forem.com/whitemarmot/i-built-an-mcp-server-that-lets-claude-watermark-images-heres-how-46mk</link>
      <guid>https://forem.com/whitemarmot/i-built-an-mcp-server-that-lets-claude-watermark-images-heres-how-46mk</guid>
      <description>&lt;h2&gt;
  
  
  I built an MCP server that lets Claude watermark images
&lt;/h2&gt;

&lt;p&gt;I'm a solo dev and I built &lt;a href="https://www.markly.cloud" rel="noopener noreferrer"&gt;Markly&lt;/a&gt;, an image watermarking service. It&lt;br&gt;
  started as a web tool, then I added a REST API, and recently I built an MCP server so that Claude&lt;br&gt;
  can watermark images directly.&lt;/p&gt;

&lt;p&gt;This post covers what MCP is, why I built the server, and how you can use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is MCP?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol) is an open standard by Anthropic that lets AI assistants connect to&lt;br&gt;
  external tools. When you add an MCP server to your Claude configuration, Claude gains new&lt;br&gt;
  capabilities - it can call your tools, pass parameters, and handle the results.&lt;/p&gt;

&lt;p&gt;Think of it as giving Claude hands. Instead of just talking about watermarks, Claude can actually&lt;br&gt;
  apply them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem I was solving&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My workflow used to be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open photo in editor&lt;/li&gt;
&lt;li&gt;Add text layer&lt;/li&gt;
&lt;li&gt;Adjust opacity, position, font&lt;/li&gt;
&lt;li&gt;Export&lt;/li&gt;
&lt;li&gt;Repeat 50 times&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The API automated steps 1-4. But I still had to write the API call, manage parameters, handle the&lt;br&gt;
  response. MCP eliminated that too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup (10 seconds)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add this to your &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"markly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"markly-mcp-server"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key needed. The free tier works immediately.&lt;/p&gt;

&lt;p&gt;Restart Claude, and you now have 4 new tools:&lt;/p&gt;

&lt;p&gt;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 &lt;br&gt;
 markly_check_usage    │ Check credits and rate limits        &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage examples&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once connected, just talk to Claude:&lt;/p&gt;

&lt;p&gt;Simple text watermark:&lt;br&gt;
 &lt;code&gt;"Add 'Copyright 2026' as a watermark to this image: https://example.com/photo.jpg"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Claude will call markly_watermark_text with sensible defaults (semi-transparent, bottom-right).&lt;/p&gt;

&lt;p&gt;Batch with logo:&lt;br&gt;
 &lt;code&gt;Watermark all these images with my logo.png, bottom-right corner, 20% opacity&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Claude calls markly_batch_watermark, uploads your files, and returns a download link.&lt;/p&gt;

&lt;p&gt;Iterative refinement:&lt;br&gt;
  &lt;code&gt;Make the text bigger and move it to the center&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Claude remembers the context and re-processes with adjusted parameters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How it works under the hood&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The MCP server is a TypeScript package that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Exposes tool definitions (name, parameters, description) via the MCP protocol&lt;/li&gt;
&lt;li&gt;When Claude calls a tool, the server makes an HTTP request to the Markly REST API&lt;/li&gt;
&lt;li&gt;The API processes the image with Imagick (text rendering, logo compositing)&lt;/li&gt;
&lt;li&gt;Returns the watermarked image&lt;/li&gt;
&lt;li&gt;The MCP server passes the result back to Claude&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The REST API is also available directly if you prefer programmatic access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;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
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pricing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The free tier works without signup or API key. It adds a small "markly.cloud" text to the output.&lt;/p&gt;

&lt;p&gt;For clean output, credit packs are one-time purchases begining at 5€ for 250 credits.&lt;/p&gt;

&lt;p&gt;Credits never expire. 1 credit = 1 image processed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API: Laravel 11, PHP 8.3, Imagick, MySQL, Redis&lt;/li&gt;
&lt;li&gt;MCP server: TypeScript, @modelcontextprotocol/sdk&lt;/li&gt;
&lt;li&gt;Hosting: VPS behind Cloudflare&lt;/li&gt;
&lt;li&gt;Payments: Stripe Checkout (for credit packs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Try it&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP server (npm): &lt;a href="https://www.npmjs.com/package/markly-mcp-server" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/markly-mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Whitemarmot/markly-mcp-server" rel="noopener noreferrer"&gt;https://github.com/Whitemarmot/markly-mcp-server&lt;/a&gt; (MIT)&lt;/li&gt;
&lt;li&gt;API landing: &lt;a href="https://www.markly.cloud/watermark-api" rel="noopener noreferrer"&gt;https://www.markly.cloud/watermark-api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP landing: &lt;a href="https://www.markly.cloud/mcp-server" rel="noopener noreferrer"&gt;https://www.markly.cloud/mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;API docs: &lt;a href="https://www.markly.cloud/developers" rel="noopener noreferrer"&gt;https://www.markly.cloud/developers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Web tool: &lt;a href="https://www.markly.cloud" rel="noopener noreferrer"&gt;https://www.markly.cloud&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
