Provenance and metadata tools for AI agents. Paid tools use x402 (USDC) at /mcp/<tool>.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Finds black boxes drawn over text in a PDF and reports where the text underneath can still be selected or copied, and redaction annotations that were never applied. Returns locations and counts, never the hidden text. Checks text only: it does not look at images, metadata or earlier revisions. Price: 0.01 USDC per PDF. MCP tool: `check_redactions`.
Base64-encoded file bytes (max 4 MiB).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http proofestry https://api.proofestry.dev/mcp
Finds black boxes drawn over text in a PDF and reports where the text underneath can still be selected or copied, and redaction annotations that were never applied. Returns locations and counts, never the hidden text. Checks text only: it does not look at images, metadata or earlier revisions. Price: 0.01 USDC per PDF. MCP tool: `check_redactions`.
| Argument | Type | Description |
|---|---|---|
| file_base64* | string | Base64-encoded file bytes (max 4 MiB). |
{
"type": "object",
"title": "FileRequest",
"required": [
"file_base64"
],
"properties": {
"file_base64": {
"type": "string",
"title": "File Base64",
"description": "Base64-encoded file bytes (max 4 MiB)."
}
}
}Removes EXIF (GPS, device, timestamps), XMP, IPTC and text metadata from a JPEG, PNG or WebP and returns the cleaned file, with a list of what was removed and what was kept (the picture, the color profile, the display orientation and the IPTC digital source type). The pixels are not re-encoded. A file that carries Content Credentials (C2PA) is refused with 409, since cleaning it would break their signature. Images up to 1 MiB inline; larger files use the upload job routes. Failed calls are never charged. MCP tool: `clean_metadata`. Price: 0.01 USDC per file.
| Argument | Type | Description |
|---|---|---|
| file_base64* | string | Base64-encoded file bytes (max 4 MiB). |
{
"type": "object",
"title": "FileRequest",
"required": [
"file_base64"
],
"properties": {
"file_base64": {
"type": "string",
"title": "File Base64",
"description": "Base64-encoded file bytes (max 4 MiB)."
}
}
}An audit record of what was marked, when, with which layers and standard versions, for one ledger. Counts unique assets (a retry never adds one). Requires `Authorization: Bearer <ledger token>`; unknown ledgers and wrong tokens get the same 404, which is not charged. Price: 0.10 USDC. MCP tool: `compliance_report`.
| Argument | Type | Description |
|---|---|---|
| ledger_id* | string |
{
"type": "object",
"title": "ReportRequest",
"required": [
"ledger_id"
],
"properties": {
"ledger_id": {
"type": "string",
"title": "Ledger Id"
}
}
}Reads and validates C2PA manifests (signature and hashes), IPTC DigitalSourceType, and generator metadata. Flags stripped, invalid or conflicting credentials. Reports signals and confidence, never a definitive 'not AI-generated'; the C2PA signer is not yet checked against the trust list. C2PA manifests are read and validated in images, PDF, Office and OpenDocument files, audio and video (see supported-formats.json). IPTC, XMP, EXIF and generator-name signals are read for JPEG, PNG, HEIC/HEIF, WebP, TIFF and AVIF; `checks_run` says what ran for each file. MCP tool: `detect_provenance`. Price: 0.002 USDC per image.
| Argument | Type | Description |
|---|---|---|
| file_base64* | string | Base64-encoded file bytes (max 4 MiB). |
{
"type": "object",
"title": "FileRequest",
"required": [
"file_base64"
],
"properties": {
"file_base64": {
"type": "string",
"title": "File Base64",
"description": "Base64-encoded file bytes (max 4 MiB)."
}
}
}Free. The compliance profiles `mark_content` can apply, the layers each uses, the regulatory basis, and whether they are beta (until the signer is on the C2PA trust list). MCP tool: `list_compliance_profiles`.
No arguments.
{
"type": "object",
"properties": {}
}Marks an AI-generated or human-made image with a compliance profile: a signed C2PA manifest with the profile's disclosure, an invisible watermark (the AI profiles), an ISCC fingerprint registered with Proofestry, and a trusted timestamp when the signing provider has one. Returns the marked file (base64 in the REST response; a short-lived download link over MCP). Marking the same image again is idempotent: it returns the same asset id and never creates a second record. Profiles help meet obligations and do not guarantee compliance; they are in beta until the signer is on the C2PA trust list. Images up to 1 MiB inline (JPEG, PNG, WebP); larger files use the upload job routes. Failed calls are never charged. MCP tool: `mark_content`. Price: 0.01 USDC per image.
| Argument | Type | Description |
|---|---|---|
| profile* | string | Compliance profile (see GET /v1/provenance/profiles). |
| ledger_id | any | Add the asset to this ledger for the compliance report. Needs `Authorization: Bearer <ledger token>`. |
| file_base64* | string | Base64-encoded file bytes (max 4 MiB). |
| source_type | any | provenance-only only: digitalCapture, digitalCreation, humanEdits or screenCapture (default digitalCreation). |
| system_name | string | The AI system that generated the content. Required for the AI profiles. |
| provider_name | string | Who provides the AI system. Required for the AI profiles. |
Free. MCP tool: `request_missing_tool`.
| Argument | Type | Description |
|---|---|---|
| description* | string | The tool you wish existed. |
{
"type": "object",
"title": "ToolRequest",
"required": [
"description"
],
"properties": {
"description": {
"type": "string",
"title": "Description",
"maxLength": 2000,
"description": "The tool you wish existed."
}
}
}Looks inside a PDF, Word, Excel or PowerPoint file, an image or a text/HTML file for what a reader does not see: scripts and launch actions, hidden or invisible text, embedded files, trailing data, and phrases that try to instruct an AI that reads the file. Reports each finding's kind, severity and location; for an injection phrase it quotes only the matched phrase (up to 80 characters), never other content. Not an antivirus and not a guarantee: `checks_run` lists what was inspected, and a file type with no checks returns `overall_risk: unknown`. Price: 0.01 USDC per file. MCP tool: `scan_file`.
| Argument | Type | Description |
|---|---|---|
| file_base64* | string | Base64-encoded file bytes (max 4 MiB). |
{
"type": "object",
"title": "FileRequest",
"required": [
"file_base64"
],
"properties": {
"file_base64": {
"type": "string",
"title": "File Base64",
"description": "Base64-encoded file bytes (max 4 MiB)."
}
}
}Lists EXIF, XMP and PNG text metadata with a risk rating. Inspects JPEG, PNG, HEIC/HEIF, WebP, TIFF and AVIF. Any other format returns `supported: false` and `overall_risk: unknown`: nothing was inspected, so no findings does not mean no metadata. MCP tool: `scan_metadata`. Price: 0.002 USDC per file.
| Argument | Type | Description |
|---|---|---|
| file_base64* | string | Base64-encoded file bytes (max 4 MiB). |
{
"type": "object",
"title": "FileRequest",
"required": [
"file_base64"
],
"properties": {
"file_base64": {
"type": "string",
"title": "File Base64",
"description": "Base64-encoded file bytes (max 4 MiB)."
}
}
}Fetches a public web page and records what it served: the final URL, the time, the HTTP status, the content type, the SHA-256 of the bytes and the title. The record is timestamped (RFC 3161) and gets a permanent proof link. Proofestry does not store the page; set `include_content` to get the bytes back to keep. Only public http(s) pages on ports 80 and 443 are fetched; pages that need a login or JavaScript are captured as served to a plain request. A page that cannot be fetched, or answers with an error status, is a 4xx/5xx and is never charged. Price: 0.02 USDC per URL. MCP tool: `snapshot_citation`.
| Argument | Type | Description |
|---|---|---|
| url* | string | A public http(s) page, on port 80 or 443. Addresses on private networks are refused. |
| include_content | boolean | Also return the fetched bytes (base64, up to 1 MiB) so you can keep them. Proofestry never stores the content. |
{
"type": "object",
"title": "SnapshotRequest",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"title": "Url",
"maxLength": 2048,
"minLength": 8,
"description": "A public http(s) page, on port 80 or 443. Addresses on private networks are refused."
},
"include_content": {
"type": "boolean",
"title": "Include Content",
"default": false,
"description": "Also return the fetched bytes (base64, up to 1 MiB) so you can keep them. Proofestry never stores the content."
}
}
}Like `snapshot_citation` for one to five URLs in a single call, fetched in parallel. All or nothing: if any URL fails, the call fails and nothing is charged. Price: 0.075 USDC per batch. MCP tool: `snapshot_citations`.
| Argument | Type | Description |
|---|---|---|
| urls* | array | One to five public http(s) URLs. All or nothing: if any fails, the call fails and is not charged. |
| include_content | boolean |
{
"type": "object",
"title": "SnapshotBatchRequest",
"required": [
"urls"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": "string"
},
"title": "Urls",
"maxItems": 5,
"minItems": 1,
"description": "One to five public http(s) URLs. All or nothing: if any fails, the call fails and is not charged."
},
"include_content": {
"type": "boolean",
"title": "Include Content",
"default": false
}
}
}Obtains an RFC 3161 timestamp token for a SHA-256 hash from a public timestamp authority and stores it, so the hash can be shown to have existed at that time. Only the hash is sent: Proofestry never sees the content. Returns the token (verifiable with `openssl ts -verify`) and a record id. A timestamp proves the hash existed then, not who made the content or that it is true. A failure at the authority is a 5xx and is never charged. Price: 0.01 USDC per hash. MCP tool: `timestamp`.
| Argument | Type | Description |
|---|---|---|
| label | string | An optional note stored with the timestamp. |
| sha256* | string | The SHA-256 of your content, as 64 hexadecimal characters. Only this hash is sent; Proofestry never sees the content. |
{
"type": "object",
"title": "TimestampCreateRequest",
"required": [
"sha256"
],
"properties": {
"label": {
"type": "string",
"title": "Label",
"default": "",
"maxLength": 100,
"description": "An optional note stored with the timestamp."
},
"sha256": {
"type": "string",
"title": "Sha256",
"pattern": "^[0-9a-fA-F]{64}$",
"description": "The SHA-256 of your content, as 64 hexadecimal characters. Only this hash is sent; Proofestry never sees the content."
}
}
}Free. Checks a file for Proofestry's marks: the C2PA manifest (validated against Proofestry's records), the invisible watermark, and an exact fingerprint of files Proofestry delivered. Reports what was found; not finding marks never means a file is unmarked. Up to 4 MiB. MCP tool: `verify_provenance`.
| Argument | Type | Description |
|---|---|---|
| file_base64* | string | Base64-encoded file bytes (max 4 MiB). |
{
"type": "object",
"title": "FileRequest",
"required": [
"file_base64"
],
"properties": {
"file_base64": {
"type": "string",
"title": "File Base64",
"description": "Base64-encoded file bytes (max 4 MiB)."
}
}
}Free. Re-checks a stored snapshot: that its fields still hash to the timestamped record, the timestamp authority's signature, and optionally that a content hash you supply is the recorded one. MCP tool: `verify_snapshot`.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| sha256 | any | Optional: a content hash to compare with the recorded one. |
{
"type": "object",
"title": "SnapshotVerifyRequest",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"sha256": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sha256",
"description": "Optional: a content hash to compare with the recorded one."
}
}
}Free. Re-checks a stored timestamp: the authority's signature over the token, that it covers the recorded hash, and optionally that a hash you supply matches. Lists each check with its result; the authority's certificate chain is not evaluated against a trust list. MCP tool: `verify_timestamp`.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| sha256 | any | Optional: a hash to compare with the timestamped one. |
{
"type": "object",
"title": "TimestampVerifyRequest",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"title": "Id"
},
"sha256": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sha256",
"description": "Optional: a hash to compare with the timestamped one."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 10, 2026.
| visible_label | boolean | Draw a visible 'AI-generated' label on the image (AI profiles only). |
| strip_metadata | boolean | Remove EXIF metadata (for example GPS) from the marked file. |
| system_version | string |
| invisible_watermark | any | provenance-only: also embed the invisible watermark. The AI profiles always do. |
{
"type": "object",
"title": "MarkRequest",
"required": [
"file_base64",
"profile"
],
"properties": {
"profile": {
"enum": [
"eu-ai-act-art50",
"ca-ai-transparency-act",
"provenance-only"
],
"type": "string",
"title": "Profile",
"description": "Compliance profile (see GET /v1/provenance/profiles)."
},
"ledger_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Ledger Id",
"description": "Add the asset to this ledger for the compliance report. Needs `Authorization: Bearer <ledger token>`."
},
"file_base64": {
"type": "string",
"title": "File Base64",
"description": "Base64-encoded file bytes (max 4 MiB)."
},
"source_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Source Type",
"description": "provenance-only only: digitalCapture, digitalCreation, humanEdits or screenCapture (default digitalCreation)."
},
"system_name": {
"type": "string",
"title": "System Name",
"default": "",
"maxLength": 100,
"description": "The AI system that generated the content. Required for the AI profiles."
},
"provider_name": {
"type": "string",
"title": "Provider Name",
"default": "",
"maxLength": 100,
"description": "Who provides the AI system. Required for the AI profiles."
},
"visible_label": {
"type": "boolean",
"title": "Visible Label",
"default": false,
"description": "Draw a visible 'AI-generated' label on the image (AI profiles only)."
},
"strip_metadata": {
"type": "boolean",
"title": "Strip Metadata",
"default": false,
"description": "Remove EXIF metadata (for example GPS) from the marked file."
},
"system_version": {
"type": "string",
"title": "System Version",
"default": "",
"maxLength": 50
},
"invisible_watermark": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Invisible Watermark",
"description": "provenance-only: also embed the invisible watermark. The AI profiles always do."
}
}
}