Skip to main content

originalpictures-mcp: MCP server for C2PA Content Credentials, AI watermarking and verification

originalpictures-mcp is the official Model Context Protocol server for Original Pictures. It lets AI assistants and agents (Claude Desktop, Claude Code, Cursor and other MCP clients) sign media with C2PA Content Credentials, add an invisible watermark and fingerprints, and verify what a file declares about its origin, through a narrow, scope-limited set of tools.

ORIGINALPICTURES_API_KEY=opk_... \
ORIGINALPICTURES_MCP_SCOPES=assets:read,jobs:read,recipes:read,verifications:read \
uvx originalpictures-mcp

It is an adapter over the typed originalpictures-sdk. It exposes reviewed read workflows, two explicitly confirmed, idempotent writes (sign and create_verification), and verify_public, the anonymous check of a local file against a public verify page. It does not proxy arbitrary API routes and has no database, object-store, worker, signer or infrastructure access.

What it does

  • Sign with C2PA (sign): starts a signing job for an uploaded asset. Every job writes a C2PA manifest (Content Credentials) following the C2PA Technical Specification 2.4; watermark and fingerprint choose whether an invisible watermark and perceptual fingerprints are added.
  • Declare AI generation: sign accepts an ai_declaration, the kind of machine-readable marking described by EU AI Act Article 50(2) and the California AI Transparency Act (SB 942).
  • Verify (create_verification, get_verification, verify_public): reports Content Credentials status, the declared origin and whether the account has a record of the file. It is never a judgement about the content itself.
  • Read your account (list_assets, list_jobs, get_usage, get_pricing and more).

Why use it

  • Least privilege. No tool is enabled until its scope is in ORIGINALPICTURES_MCP_SCOPES. The API independently enforces the scopes granted to the key.
  • No surprise bills. The two billable tools show a "Cost preview" in their description and in _meta["com.originalpictures/billing"], require an exact confirmation string, and accept max_billable_operations to refuse a call that would start more billable work than you allow.
  • Clear tool hints. Every tool sets title, readOnlyHint, destructiveHint, idempotentHint and openWorldHint explicitly.
  • No media in the conversation. Media bytes never travel in a tool argument or result.

Install

Run it without a separate install step:

uvx originalpictures-mcp

or install it:

pipx install originalpictures-mcp

Requires Python 3.12 or later.

Quickstart

  1. Create a dedicated API key in the console under API keys, with only the scopes your assistant needs.
  2. Add the server to your MCP client.

Claude Desktop (claude_desktop_config.json) and Cursor (~/.cursor/mcp.json) use the same mcpServers entry:

{
  "mcpServers": {
    "originalpictures": {
      "command": "uvx",
      "args": ["originalpictures-mcp"],
      "env": {
        "ORIGINALPICTURES_API_KEY": "opk_...",
        "ORIGINALPICTURES_API_BASE_URL": "https://api.originalpictures.com",
        "ORIGINALPICTURES_MCP_SCOPES": "assets:read,jobs:read,recipes:read,verifications:read"
      }
    }
  }
}

Claude Code:

claude mcp add originalpictures \
  -e ORIGINALPICTURES_API_KEY=opk_... \
  -e ORIGINALPICTURES_API_BASE_URL=https://api.originalpictures.com \
  -e ORIGINALPICTURES_MCP_SCOPES=assets:read,jobs:read \
  -- uvx originalpictures-mcp
  1. Ask the assistant, for example: "List my five most recent signed assets."

Tools

Tool Scope Notes
get_current_user identity:read
list_assets, get_asset, list_receipts, get_signing_receipt assets:read
list_jobs, get_job, list_recipes jobs:read
get_recipe recipes:read
get_usage billing:read
get_pricing billing:read The versioned rates that price each billable operation.
list_verifications, get_verification_history verifications:read
get_verification recovery:read
create_verification verify:write Billable. confirmation must be exactly verify:<object_id>.
sign sign:write Billable. Signs an uploaded asset_id; watermark and fingerprint are required flags. confirmation must be exactly sign:<asset_id>.
verify_public verify:write STDIO only. Reads one absolute local file (at most 25 MB, no symlinks) and checks it against a verify page slug, without the API key.

sign refuses an ai_declaration together with watermark: true before calling the API: "AI-generated mark needs a sign-only call (C2PA claim plan)". Media is uploaded with the SDKs, the CLI or the REST API; sign starts one billable operation for the signature, plus one each for the watermark and fingerprints when chosen.

Examples

1. Read-only assistant (safe default)

ORIGINALPICTURES_API_KEY=opk_... \
ORIGINALPICTURES_MCP_SCOPES=assets:read,jobs:read,recipes:read,verifications:read \
uvx originalpictures-mcp

Prompts that work: "Which of my jobs failed this week and why?", "Show the signing receipt for asset ast_…", "What does a watermark cost per image?" (with billing:read).

2. Signing assistant with a spend guard

Add sign:write to the scopes. When the assistant calls sign, it must pass confirmation: "sign:<asset_id>", and you can cap a call with max_billable_operations:

{
  "asset_id": "ast_…",
  "watermark": true,
  "fingerprint": true,
  "idempotency_key": "mcp-sign-2026-11-07-001",
  "confirmation": "sign:ast_…",
  "max_billable_operations": 3
}

3. Check a local file against a public verify page

With verify:write in the scopes and the default STDIO transport, verify_public reads one absolute local path and checks it against a page slug (for example studio-nova) without sending the API key. The result states what the file declares about its origin and whether the page owner's system has a record of it; show its statement with it. Each check is billed to the page owner. It is not offered over HTTP, because a remote server must never read files on its own host.

4. Use the hosted server instead (no local install)

The same tools are served by the API at https://api.originalpictures.com/mcp (stateless Streamable HTTP, Authorization: Bearer opk_...), with upload tools for agents that have no local files. See Hosted MCP server.

5. Run your own HTTP endpoint on loopback

ORIGINALPICTURES_API_KEY=opk_... \
ORIGINALPICTURES_MCP_SCOPES=assets:read,jobs:read \
ORIGINALPICTURES_MCP_REMOTE_TOKEN='a-long-random-secret' \
originalpictures-mcp --transport http --host 127.0.0.1 --port 8000

The MCP bearer token is distinct from the upstream API key. Plaintext HTTP accepts only literal IPv4/IPv6 loopback addresses or localhost; wildcard, LAN, public and other hostname bindings are rejected before the server starts. Put a separately reviewed TLS terminator on the same host in front of the loopback listener when remote access is required. Legacy SSE and WebSocket transports are not supported.

Configuration

Variable Meaning Default
ORIGINALPICTURES_API_KEY API key (required, server-side secret) none
ORIGINALPICTURES_MCP_SCOPES Comma-separated tool scope allowlist empty: no tool enabled
ORIGINALPICTURES_API_BASE_URL API origin https://api.originalpictures.com
ORIGINALPICTURES_MCP_REMOTE_TOKEN Bearer token for --transport http (16 to 4096 chars) none
ORIGINALPICTURES_MCP_DEFAULT_DEADLINE_SECONDS Default per-call deadline 20
ORIGINALPICTURES_MCP_MAX_DEADLINE_SECONDS Largest deadline a call may ask for (at most 120) 120
ORIGINALPICTURES_MCP_MAX_OUTPUT_BYTES Bound on one tool result (1 KiB to 1 MiB) 262144
ORIGINALPICTURES_MCP_MAX_PAGE_SIZE Largest list page (1 to 100) 100

Command-line options: --transport (stdio, the default, or http), --host, --port (default 8000) and --path (default /mcp).

How it works

  1. Your MCP client starts originalpictures-mcp (STDIO) or connects to it (HTTP).
  2. The server lists only the tools whose scope is in ORIGINALPICTURES_MCP_SCOPES.
  3. Each tool call is checked locally (scope, argument bounds, confirmation string, billable-operation cap), then sent through originalpictures-sdk to the API with your key.
  4. The API enforces the key's own scopes, quotas and spend caps, and returns a bounded result (at most ORIGINALPICTURES_MCP_MAX_OUTPUT_BYTES).

Troubleshooting

Symptom Likely cause and fix
The client shows no Original Pictures tools ORIGINALPICTURES_MCP_SCOPES is empty or misspelled; list at least one scope.
ORIGINALPICTURES_API_KEY is required The key is missing from the client's env block.
A tool answers with an authentication error The key was revoked or expired; create a new one in the console.
A tool answers with a permission error The key lacks the scope the tool needs; the local allowlist does not grant scopes.
sign is refused before any request confirmation is not exactly sign:<asset_id>, or the call exceeds max_billable_operations.
--transport http refuses to start The host is not loopback, or ORIGINALPICTURES_MCP_REMOTE_TOKEN is missing or short.
uvx is not found Install uv, or use pipx install originalpictures-mcp.

FAQ

Is this C2PA? Yes. Signing writes standard C2PA manifests (Content Credentials) that any C2PA-aware validator, such as c2patool, can read. Original Pictures is listed on the C2PA Conforming Products List as a generator product under the C2PA Conformance Program 0.2 (C2PA Technical Specification 2.4).

Is Original Pictures audited? Original Pictures Technologies, Inc. holds ISO/IEC 27001:2022 certification for its information security management system (GCAI, certificate GCAI-ISMS-PD91) and ISO/IEC 42001:2023 certification for its AI management system (TNV). It has a SOC 2 Type I report from Percilchofe CPA LLC as of 19 October 2026, and runs a GDPR compliance program. The certifications cover management systems, not this package. See Security and compliance.

Does it store my media? The MCP server stores nothing itself. Files uploaded to Original Pictures are processed on private servers, encrypted in transit and at rest, in isolated processing, and published outputs are kept for the retention your API key selects. Operator views show metadata only, and emergency access is audited. This is private server processing, not end-to-end encryption.

What formats are supported? Embedded C2PA for JPEG, PNG, WebP, TIFF, AVIF, WAV, MP3, AAC (.m4a) and MP4 (H.264/AAC); sign-only embedding for GIF, JPEG XL, SVG, DNG, HEIC/HEIF, QuickTime, AVI and FLAC; a sidecar .c2pa manifest for PDF, EPUB, DOCX, text, fonts and ML model files. list_recipes shows what your deployment offers.

Can the assistant spend money without asking? Only if you add sign:write or verify:write, and even then each billable call needs the exact confirmation string. Use max_billable_operations and a key with a spend cap.

How much does it cost? See pricing, or ask the assistant to call get_pricing.

How do I get an API key? Sign in to the console and create one under API keys.

Licence

Licensed under the Apache License, Version 2.0; the full text is in the LICENSE file shipped with this package. Copyright © 2026 Original Pictures Technologies, Inc. The licence grants no rights to the Original Pictures name or logo.

Metadata

Release files for originalpictures-mcp 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for originalpictures-mcp 0.1.1
File Size Uploaded Provenance Actions
originalpictures_mcp-0.1.1.tar.gz 22.7 kB With provenance Details for originalpictures_mcp-0.1.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for originalpictures-mcp 0.1.1
File Interpreter ABI Platform Actions
originalpictures_mcp-0.1.1-py3-none-any.whl Python 3 none any Details for originalpictures_mcp-0.1.1-py3-none-any.whl

Total release size: 48.8 kB

Release files / originalpictures_mcp-0.1.1.tar.gz

Download URL originalpictures_mcp-0.1.1.tar.gz
Size 22.7 kB
Tags Source
SHA-256 checksum
How to use checksums
e38cb137b1ef6e5e5f8f34ab2463155b03ca153930bae5f1d13d702a0c67f323
BLAKE2b-256 checksum
How to use checksums
a78282496560de764cb3f965db6d449074e1dfe9932c9ce13f5be320feaad218
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.

Transparency log

Release files / originalpictures_mcp-0.1.1-py3-none-any.whl

Download URL originalpictures_mcp-0.1.1-py3-none-any.whl
Size 26.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7ac2d78318f846027d741cd0aafd0d67ab8ddf2b96205933ee47e7a2a0404e9e
BLAKE2b-256 checksum
How to use checksums
17e93265e6182f1d775749f49f78c8373b626cb549a4c51cce7d3a84155364fa
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.

Transparency log

Security for originalpictures-mcp 0.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for originalpictures_mcp-0.1.1.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 11, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page