Getting started

MCP server

Use the Etchv MCP server to watermark files, detect watermarks and manage assets from your AI assistant. It runs locally over stdio with your API key.

Let your AI assistant watermark files, detect watermarks and manage assets through the Etchv API. MCP (Model Context Protocol) is a standard way for assistants to use outside tools. The open-source MCP server runs on your computer over stdio (standard input and output).

Install and connect

You need Node.js 24+, an API key, a local media folder and an MCP client that can start local servers.

Add this to your client’s configuration. Create the folder first and replace the absolute path. Supply your key through your client's secure configuration.

JSON
{
  "mcpServers": {
    "etchv": {
      "command": "npx",
      "args": ["-y", "@etchv-labs/mcp-server@1"],
      "env": {
        "ETCHV_API_KEY": "YOUR_ETCHV_API_KEY",
        "ETCHV_FILES_ROOT": "/absolute/path/media"
      }
    }
  }
}

Restart your client, then ask it to run check_api_key. This check uses no credits. There is no hosted MCP URL, so clients that only support remote servers cannot connect.

CLI setup for Claude Code and Codex

Claude Code:

Shell
claude mcp add etchv --env ETCHV_API_KEY=YOUR_ETCHV_API_KEY \
  --env ETCHV_FILES_ROOT=/absolute/path/media -- npx -y @etchv-labs/mcp-server@1

Codex:

Shell
codex mcp add etchv --env ETCHV_API_KEY=YOUR_ETCHV_API_KEY \
  --env ETCHV_FILES_ROOT=/absolute/path/media -- npx -y @etchv-labs/mcp-server@1

Keep your key out of conversations. Other clients can use the same command, arguments and environment variables.

What you can ask

  • “Watermark this PDF for delivery-42, keeping its text selectable.”
  • “Check this video for an Etchv watermark.”
  • “List my latest watermarked assets and download the one I choose.”
  • “Share the board pack with alex@example.com and sam@example.com so each gets their own copy, then tell me who has opened it.”
  • “Watermark every PDF in contracts/ with the file name as the recipient and save the results to delivered/.”

Your first watermark

Put photo.jpg in the media folder, then ask:

Watermark photo.jpg for delivery-42. Save photo-watermarked.jpg, then detect its watermark.

The assistant calls watermark_media with a non-empty data object and an idempotency_key that stays the same on retries. It collects the result with get_job and get_job_result, using operation: "embed" and an output_path. Detection uses detect_media and operation: "detect".

Detection returns the watermark ID, a digest (fixed-length fingerprint) of your data. It does not return the original JSON. Keep your source record in your own system.

Many files at once

watermark_batch watermarks up to 100 files in one batch, each with its own data. Name the files with input_paths, with input_dir and an optional glob such as "*.pdf" (no braces or ..), or with items that carry their own data. A data_template fills in the rest: string values may use {filename}, {stem} (the name without its extension) and {index} (the file's 0-based position).

Batches take images, PDF, DOCX and PPTX documents, and videos.

The server uploads each file once and starts the batch. With wait: true it checks progress at the pace the API asks for, for up to wait_seconds (10 minutes by default), and with output_dir it saves the results. Clients that ask for progress see each upload and check; keep wait_seconds below your client's tool timeout.

Otherwise the assistant follows the batch with get_batch and collects it with download_batch. It saves each successful file under the name it has in the batch zip, such as 001-contract-acme-watermarked.pdf, or the zip itself when the batch was created with archive: true. Failed items are listed with their error codes.

Each file costs the same credits as a single request, and files that fail are refunded. Calling watermark_batch again with the same arguments resumes or returns the same batch instead of a new one. If that batch expired before it started, or finished and its results expired after 24 hours, the tool says so; pass a new idempotency_key to run the files again. More than 100 files are refused before anything is sent; split them into several batches.

Sync or async

ModeBehavior
Async · defaultLeave out mode or use "async". You get a receipt, then collect the result
SyncUse mode: "sync". Embedding needs output_path. Returns a result or a 202 receipt
Async · default
Behavior
Leave out mode or use "async". You get a receipt, then collect the result
Sync
Behavior
Use mode: "sync". Embedding needs output_path. Returns a result or a 202 receipt

After a timeout, reuse the same idempotency key (a value you choose so a retry isn't run twice). Accepted jobs keep running. The server does not keep checking for results forever. See job handling.

Supported media

mediaFormats and limits
imagesSupported images, including animation, TIFF pages and layers; 50 MiB upload
documentsPDF, DOCX and PPTX; PDF up to 50 MiB and 2,000 pages (a 2,000-page PDF up to about 1 MiB); DOCX and PPTX 20 MiB
videosMP4, MOV, WebM, Matroska, MPEG and AVI with a supported codec; 20 MiB upload
images
Formats and limits
Supported images, including animation, TIFF pages and layers; 50 MiB upload
documents
Formats and limits
PDF, DOCX and PPTX; PDF up to 50 MiB and 2,000 pages (a 2,000-page PDF up to about 1 MiB); DOCX and PPTX 20 MiB
videos
Formats and limits
MP4, MOV, WebM, Matroska, MPEG and AVI with a supported codec; 20 MiB upload

Detection takes delivered files up to 192 MiB for images, 95 MiB for PDFs and 100 MiB for DOCX, PPTX and video. Files over 40 MiB are sent as a large-file upload automatically; set ETCHV_LARGE_FILE_THRESHOLD (bytes) to change that. Image and document detection above 95 MiB returns a job receipt for get_job_result.

API limits and plan access still apply. Downloads can be up to 512 MiB and 10 minutes. The API must start responding within 45 seconds. Embedding and detection use normal API credits.

Tools and permissions

ToolsRequired scope
check_api_keyAny valid key
watermark_mediawatermarks:embed
detect_mediawatermarks:detect
get_job, get_job_resultMatching embed or detect scope
watermark_batch, get_batch, download_batchwatermarks:embed
list_assets, get_asset, download_assetassets:read
update_assetassets:write
delete_assetassets:delete + owner/admin
create_link, revoke_linklinks:write
list_links, get_linklinks:read
delete_link, remove_link_recipientlinks:write + assets:delete + owner/admin
list_storage_destinations, list_storage_deliveries, get_storage_deliverystorage:read
verify_storage_destination, store_asset, retry_storage_deliverystorage:write + owner/admin
list_webhooks, list_webhook_deliverieswebhooks:read
redeliver_webhookwebhooks:write + owner/admin
check_api_key
Required scope
Any valid key
watermark_media
Required scope
watermarks:embed
detect_media
Required scope
watermarks:detect
get_job, get_job_result
Required scope
Matching embed or detect scope
watermark_batch, get_batch, download_batch
Required scope
watermarks:embed
list_assets, get_asset, download_asset
Required scope
assets:read
update_asset
Required scope
assets:write
delete_asset
Required scope
assets:delete + owner/admin
create_link, revoke_link
Required scope
links:write
list_links, get_link
Required scope
links:read
delete_link, remove_link_recipient
Required scope
links:write + assets:delete + owner/admin
list_storage_destinations, list_storage_deliveries, get_storage_delivery
Required scope
storage:read
verify_storage_destination, store_asset, retry_storage_delivery
Required scope
storage:write + owner/admin
list_webhooks, list_webhook_deliveries
Required scope
webhooks:read
redeliver_webhook
Required scope
webhooks:write + owner/admin

Turn on only the scopes you need. Your MCP client decides when to ask you to approve paid operations and changes. Read etchv://capabilities inside the assistant for help with the tools.

Storage and webhooks

OptionHow to use it
Etchv storage · defaultJob results last 24 hours; asset files are kept up to 1 year while subscribed (30 days on the trial); records remain until deleted
Customer storageConfigure and verify in the dashboard; pass storage_destination_id and optional storage_key when embedding
Move an existing resultUse store_asset. Once delivery succeeds, Etchv removes its temporary copy and downloads read from your bucket
WebhooksConfigure in the dashboard; pass webhook_id on async submissions
GPUSet accelerator: "gpu" on Business or Enterprise
PDF scripts and actionsSet active_content: "remove_auto_run" on watermark_media or watermark_batch (PDFs only)
Etchv storage · default
How to use it
Job results last 24 hours; asset files are kept up to 1 year while subscribed (30 days on the trial); records remain until deleted
Customer storage
How to use it
Configure and verify in the dashboard; pass storage_destination_id and optional storage_key when embedding
Move an existing result
How to use it
Use store_asset. Once delivery succeeds, Etchv removes its temporary copy and downloads read from your bucket
Webhooks
How to use it
Configure in the dashboard; pass webhook_id on async submissions
GPU
How to use it
Set accelerator: "gpu" on Business or Enterprise
PDF scripts and actions
How to use it
Set active_content: "remove_auto_run" on watermark_media or watermark_batch (PDFs only)

Storage credentials and signing secrets stay out of tool arguments and responses.

File handling

Files must stay inside ETCHV_FILES_ROOT. Paths that climb out of it (../) and symlinks are rejected. Output folders must already exist, and files are never overwritten. Use a separate folder that you control.

Input files go to the Etchv API. Results stay on your disk. The assistant only gets file paths and checksums. Treat asset names and metadata as data, not instructions.

View source on GitHub

Your privacy, your choice

We use essential cookies to keep Etchv working. Optional analytics helps us improve the site. Analytics is on by default; you can turn it off in preferences. PostHog loads only if you accept all. Privacy policy

ETCHV

Privacy preferences

Choose what you allow on this browser. Analytics is enabled by default. You can turn it off, and change your choice at any time.

Essential

Always active

Supports secure sign-in, account sessions, site security, and remembering your privacy choice. These are needed for Etchv to work.

Analytics

Helps us understand visits and improve the website using page-view and device statistics, which do not use cookies. PostHog also measures visits and campaigns and may set cookies; it loads only after you save a choice with analytics on. Turning this off stops future analytics events.

We do not load advertising scripts. Meeting calendars load only when you open them. These preferences do not change your account, watermarking requests, or asset storage.

Your choice is remembered for 180 days on this browser. Privacy policy