markproof-mcp
<img src="assets/logo-400.png" alt="" width="72" align="right">
# markproof-mcp
[](https://www.npmjs.com/package/markproof-mcp) [](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.Ajinkya710/markproof)
An [MCP](https://modelcontextprotocol.io) server that lets AI agents mark the images and audio they generate for the EU AI Act's Article 50, using [Markproof](https://markproof.co): an invisible watermark plus a signed C2PA manifest (Content Credentials), and verification of any file.
> **Is your AI output Article 50-ready?** Drop a file into the [free checker](https://markproof.co/check) (no signup) to see whether it carries a watermark and signed Content Credentials.
## Tools
| Tool | What it does |
|---|---|
| `mark_file` | Watermarks and C2PA-signs a local image (PNG, JPEG, WebP) or audio file (WAV, MP3). Writes the marked copy beside the original as `<name>.marked.png` / `.wav` and returns its watermark code and public verification URL. Optional `visible_label` (`true` or text, images only) also draws a visible "AI-generated" label, at `label_position`. |
| `verify_file` | Checks a file for a Markproof watermark and a C2PA manifest, whether the signature is valid, and whether it matches your account's records. |
| `get_asset` | Looks up a file you marked by its `asset_id`. |
`mark_file` and `verify_file` each count as one API call against your plan. `get_asset` is free.
## Setup
1. Create an API key on your [Markproof dashboard](https://markproof.co/dashboard) (250 free calls a month).
2. Add the server to your MCP client.
**Claude Desktop** — `claude_desktop_config.json`:
```json
{
"mcpServers": {
"markproof": {
"command": "npx",
"args": ["-y", "markproof-mcp"],
"env": { "MARKPROOF_API_KEY": "lt_live_..." }
}
}
}
```
**Claude Code:**
```sh
claude mcp add markproof --env MARKPROOF_API_KEY=lt_live_... -- npx -y markproof-mcp
```
**Cursor** — `.cursor/mcp.json`: the same `mcpServers` block as Claude Desktop.
Then ask your agent something like *"Generate a product image and mark it with Markproof before saving it."*
## Configuration
| Variable | |
|---|---|
| `MARKPROOF_API_KEY` | Required. |
| `MARKPROOF_BASE_URL` | Optional, for testing against another deployment. Default `https://markproof.co/v1`. |
Keep your key out of shared config files and version control.
## Notes
- Files are sent to Markproof's API, which processes them in the EU and doesn't keep them.
- Direct uploads are limited to about 4.5 MB per file. For bigger files, give `verify_file` a public `url` instead of a `path` (up to 25 MB). Marked audio comes back as WAV, so this matters for clips over about 25 seconds.
- If a result includes `watermark_robust: false`, the image was too smooth or featureless for a robust watermark. It's still marked and signed; rely on the C2PA manifest for that file.
## Claude Desktop extension
Each [release](https://github.com/Ajinkya710/markproof-mcp/releases) has a `markproof-mcp.mcpb` bundle: double-click it to install in Claude Desktop, which asks for your API key and keeps it in the OS keychain.
## Development
```sh
npm install
npm test # tools against a fake client, no network
npm run build # dist/ for npm
npm run bundle # markproof-mcp.mcpb (one-file server + manifest in mcpb/)
npm run bundle:smithery # same plus tool input schemas, which Smithery needs and the MCPB spec rejects
```
The server is a thin layer over the [`markproof`](https://www.npmjs.com/package/markproof) SDK. Issues and PRs welcome.
## License
MIT
TDQS
Scored across 3 tools
Each tool targets a distinct action on a distinct input: mark_file writes a watermark to a file, verify_file inspects an arbitrary file for marks, and get_asset retrieves a stored record by asset_id. The descriptions make the file-path vs asset_id boundary explicit, so misselection is unlikely despite the shared 'record lookup' element in verify_file.
All three tools follow a clean verb_noun pattern (mark_file, verify_file, get_asset) with consistent snake_case. The conventions are predictable enough that a caller can guess naming for any future tool.
Three tools map exactly onto the narrow workflow of write-mark, check-mark, and fetch-record; nothing feels redundant or padded. This sits at the low end of the ideal 3-15 range but is well-matched to a single-purpose watermarking service.
The core lifecycle (mark, verify, retrieve by id) is fully covered with no dead ends for the primary use case. The main gap is the absence of a list/enumerate operation for assets marked by the account, so an agent must persist asset_ids itself; revocation or quota-checking is also absent but less critical.