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.
{
"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:
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@1Codex:
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@1Keep 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
| Mode | Behavior |
|---|---|
| Async · default | Leave out mode or use "async". You get a receipt, then collect the result |
| Sync | Use mode: "sync". Embedding needs output_path. Returns a result or a 202 receipt |
- Async · default
- Behavior
- Leave out
modeor use"async". You get a receipt, then collect the result
- Sync
- Behavior
- Use
mode: "sync". Embedding needsoutput_path. Returns a result or a202receipt
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
media | Formats and limits |
|---|---|
images | Supported images, including animation, TIFF pages and layers; 50 MiB upload |
documents | 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 | MP4, 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
| Tools | Required scope |
|---|---|
check_api_key | Any valid key |
watermark_media | watermarks:embed |
detect_media | watermarks:detect |
get_job, get_job_result | Matching embed or detect scope |
watermark_batch, get_batch, download_batch | watermarks:embed |
list_assets, get_asset, download_asset | assets:read |
update_asset | assets:write |
delete_asset | assets:delete + owner/admin |
create_link, revoke_link | links:write |
list_links, get_link | links:read |
delete_link, remove_link_recipient | links:write + assets:delete + owner/admin |
list_storage_destinations, list_storage_deliveries, get_storage_delivery | storage:read |
verify_storage_destination, store_asset, retry_storage_delivery | storage:write + owner/admin |
list_webhooks, list_webhook_deliveries | webhooks:read |
redeliver_webhook | webhooks: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: inside the assistant for help with the tools.
Storage and webhooks
| Option | How to use it |
|---|---|
| Etchv storage · default | 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 | Configure and verify in the dashboard; pass storage_destination_id and optional storage_key when embedding |
| Move an existing result | Use store_asset. Once delivery succeeds, Etchv removes its temporary copy and downloads read from your bucket |
| Webhooks | Configure in the dashboard; pass webhook_id on async submissions |
| GPU | Set accelerator: "gpu" on Business or Enterprise |
| PDF scripts and actions | Set 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_idand optionalstorage_keywhen 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_idon 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"onwatermark_mediaorwatermark_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.