Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
作者提供的说明(英文原文)
Invisible watermarking and watermark detection for images, PDFs and videos with Etchv.
这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。
我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。
选择你使用的 AI 应用,然后复制设置。
ETCHV_API_KEY, ETCHV_FILES_ROOT, ETCHV_API_BASE_URL标为机密的值是你账户的钥匙。千万不要分享给别人,也不要粘贴到聊天里。
你需要
你用的是哪个应用?
在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。
打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json
{
"mcpServers": {
"etchv-labs": {
"command": "npx",
"args": [
"-y",
"@etchv-labs/mcp-server"
],
"env": {
"ETCHV_API_KEY": "your-value",
"ETCHV_FILES_ROOT": "your-value",
"ETCHV_API_BASE_URL": "your-value"
}
}
}
}在终端中运行这条命令
claude mcp add etchv-labs --env ETCHV_API_KEY=your-value --env ETCHV_FILES_ROOT=your-value --env ETCHV_API_BASE_URL=your-value -- npx -y @etchv-labs/mcp-server运行前请先填写空着的值。
粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json
{
"mcpServers": {
"etchv-labs": {
"command": "npx",
"args": [
"-y",
"@etchv-labs/mcp-server"
],
"env": {
"ETCHV_API_KEY": "your-value",
"ETCHV_FILES_ROOT": "your-value",
"ETCHV_API_BASE_URL": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
粘贴到项目中的 .vscode/mcp.json
{
"servers": {
"etchv-labs": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@etchv-labs/mcp-server"
],
"env": {
"ETCHV_API_KEY": "your-value",
"ETCHV_FILES_ROOT": "your-value",
"ETCHV_API_BASE_URL": "your-value"
}
}
}
}浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。
这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。
你的选择通过 Cookie 保存在这台设备上,无需账户。
ETCHV_API_BASE_URL env这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。
它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。
我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月6日
注册名称已通过 GitHub 账户 etchv-labs 验证,该账户拥有此仓库
我们还没有从 GitHub 读取这个仓库
我们还没有从 GitHub 读取这个仓库
它在你的电脑上运行,没有互联网端点
在你的电脑上运行,改用本地设置
它在你的电脑上运行;我们只能读取互联网端点的工具列表
与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。
它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。
你需要填写:ETCHV_API_KEY, ETCHV_FILES_ROOT
它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。
GitHub 仓库最后更新于–,最新版本(1.6.0)于9天前进入注册中心。
支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Node.js。
同一分类中有:Spec Driven Development, Remote Desktop Commander, Reelsaw
同一分类中其他作者的服务器,按星标数排序。
如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Drive a self-hosted Reelsaw: turn long videos into vertical clips, edit, re-render and export them.
按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。
A local stdio Model Context Protocol server that lets AI assistants watermark and detect images, PDFs and videos with Etchv.
| Variable | Required | Description |
|---|---|---|
ETCHV_API_KEY | Yes | Etchv API key. Keep it in your client's secret or env config, never in chat. |
ETCHV_FILES_ROOT | Yes | Absolute path of an existing directory. All input and output files must be inside it. |
ETCHV_API_BASE_URL | No | API origin. Defaults to https://api.etchv.com. |
ETCHV_LARGE_FILE_THRESHOLD | No | Files above this many bytes are uploaded once to a signed URL and sent by ID. Defaults to 40 MiB. |
claude mcp add etchv --scope user \
-e ETCHV_API_KEY="$ETCHV_API_KEY" \ -e ETCHV_FILES_ROOT="$HOME/etchv-media" \ -- npx -y @etchv-labs/mcp-server@1
This repository is also a Cursor plugin (.cursor-plugin/plugin.json with mcp.json) and a Gemini CLI extension (gemini-extension.json). Both run the same package and need ETCHV_API_KEY and ETCHV_FILES_ROOT. Gemini CLI asks for them at install; in Cursor, set them under Plugins, then Configure:
gemini extensions install https://github.com/etchv-labs/mcp-server
mcpServers clientsAdd this to the client's MCP config (for example claude_desktop_config.json or ~/.cursor/mcp.json) and restart it:
{
"mcpServers": { "etchv": { "command": "npx", "args": ["-y", "@etchv-labs/mcp-server@1"], "env": { "ETCHV_API_KEY": "YOUR_ETCHV_API_KEY", "ETCHV_FILES_ROOT": "/absolute/path/to/etchv-media" } } } }
Then ask the assistant to run check_api_key to confirm the connection.
| Tool | What it does | Key scope |
|---|---|---|
check_api_key | Show organization ID, key ID and scopes; no credits | Any valid key |
watermark_media | Watermark a file, sync or async; spends credits | watermarks:embed (assets:read for links) |
detect_media | Detect a watermark, sync or async; uses credits | watermarks:detect |
create_upload | Create an upload session and return its signed upload URL | watermarks:embed, or watermarks:detect for detect |
get_job, get_job_result | Read job status; collect a finished result | Matching embed/detect scope |
watermark_batch | Watermark up to 100 local files in one batch, each with its own data; spends credits | watermarks:embed |
get_batch, download_batch | Follow a batch; save each result or the batch's zip | watermarks:embed |
list_assets, get_asset, download_asset | List, inspect, download or link to assets | assets:read |
update_asset | Rename or replace metadata (version-checked) | assets:write |
delete_asset | Delete an asset | assets:delete, owner/admin |
create_link | Share a source asset so each recipient opens their own watermarked copy; copies spend credits | links:write |
list_links, get_link | List links; read one with each recipient's opens and copy | links:read |
revoke_link | Stop new opens and downloads of a link | links:write |
delete_link, remove_link_recipient | Delete a link, or one recipient, with their opens, downloads and copies; can't be undone | links:write, assets:delete, owner/admin |
list_storage_destinations, list_storage_deliveries, get_storage_delivery | Inspect customer storage | storage:read |
verify_storage_destination, store_asset, retry_storage_delivery | Test a bucket; deliver or retry a result | storage:write, owner/admin |
list_webhooks, list_webhook_deliveries | Inspect webhook endpoints and deliveries | webhooks:read |
redeliver_webhook | Resend an existing event | webhooks:write, owner/admin |
Every tool has a title and readOnlyHint, destructiveHint, idempotentHint and openWorldHint annotations.
watermark_media and detect_media take the file as exactly one of:
input_path: a local file inside ETCHV_FILES_ROOT.input_url: a public HTTPS URL. The server downloads it and submits it like a local file. See Security for the checks it applies. The file name comes from the Content-Disposition header, else the URL path; pass filename to set it. Its extension must match media.upload_id: an upl_ ID from create_upload. A client that can send files itself calls create_upload with kind (image, document, video, or detect to check a delivered file), filename and the exact size in bytes, PUTs the bytes to the returned upload.url without an API key, then passes upload_id. An upload is used once and expires after 24 hours.asset_id: an existing asset, such as a delivered file to check. The server downloads it and submits it again. filename can override its name here too.A watermarked file is saved to output_path when one is given (sync watermark_media, get_job_result and download_asset). Without output_path, these tools return the result's asset_id and metadata with download_url and download_expires_at: a link that works without an API key for 15 minutes. Anyone with the link can download the file, so share it only with the person who needs it. Creating a link needs the assets:read scope; if it fails, the error names the asset so you can call download_asset once the key allows it.
Submissions require a stable idempotency_key; reuse it when retrying so you are not charged twice. Image and PDF uploads are limited to 50 MiB and DOCX, PPTX and video uploads to 20 MiB. A PDF has 1 to 2,000 pages, and its watermarked copy must fit in 95 MiB with 48 KiB per page, so a 2,000-page PDF can be up to about 1 MiB. Detection takes the files Etchv delivered: up to 192 MiB for images, 95 MiB for PDFs and 100 MiB for DOCX, PPTX and video. Files over 40 MiB go through an upload session automatically, and image or document detection above 95 MiB returns a job receipt to collect with get_job_result. Storage destinations and webhook endpoints are created in the dashboard, not through this server.
watermark_media and detect_media accept an optional accelerator (cpu, the default, or gpu). GPU processing requires a Business or Enterprise plan and costs 3× credits; if no GPU is ready, the job runs on CPU at normal credits. Results report the hardware actually used as accelerator, and get_job also returns accelerator_requested. watermark_media and watermark_batch also accept active_content for PDFs: keep (the default) returns scripts and actions as uploaded, and remove_auto_run removes what a PDF viewer runs by itself, such as open actions, document-level JavaScript and XFA forms. In a batch, remove_auto_run needs every file to be a PDF. When a rate or concurrency limit is reached, errors include retry_after_seconds and point to the plan upgrade page. Trial and Launch plans run one operation at a time.
watermark_batch takes up to 100 files, named one of three ways: input_paths, input_dir with an optional glob (for example "contracts/*.pdf"; braces and .. are refused), or items with their own data. A data_template fills in each file's data; string values may use {filename}, {stem} and {index} (the file's 0-based position). The server creates the batch, uploads each file once to its signed URL without the API key, and starts it. With wait: true it polls at the pace the API asks for, for up to wait_seconds (default 600), sending progress notifications when the client asks for them, and with output_dir saves the results. Otherwise call get_batch, then download_batch, which saves each successful file under its name in the batch zip (NNN- -watermarked. ), or the single zip when the batch was created with archive: true, and lists failed items with their error codes. Each file costs the same credits as a single request, and files that fail are refunded. Retrying with the same arguments resumes or returns the same batch; if that batch expired unstarted or its results have expired, the tool asks for a new idempotency_key.
The etchv-mcp command always runs in local mode. createServer in src/server.ts also takes mode: "hosted" for a server that runs remotely and has no access to the user's files. In hosted mode no filesRoot is needed; input_path, output_path and the other local file arguments are left out of every tool schema; watermark_batch and download_batch are not offered; results are returned as download links; and the server instructions and etchv://capabilities describe that mode.
ETCHV_API_KEY, sent only to the configured origin, and never appears in tool arguments, results, errors or logs.ETCHV_FILES_ROOT: traversal and symlinks are rejected, and existing files are never overwritten.input_url must be HTTPS without a user name or password. The host must resolve only to public addresses: loopback, private, link-local, carrier-grade NAT, multicast, reserved and documentation ranges are refused, including IPv6 forms that embed such an IPv4 address. The connection uses the checked address, at most 3 redirects are followed and each is checked again, the download is capped at the operation's upload limit and times out, and the API key is never sent to the URL.Questions or bug reports: open an issue here or email hello@etchv.com.
MIT