Skip to main content
Planned protocol reference. These are proposed Talent API MCP tool definitions, not a tool list from a deployed server. The current sandbox is accessible over HTTP only. Start with the runnable quickstart and sandbox support matrix.
Each proposed tool calls one API endpoint as the account that connected. Its arguments are the endpoint’s request body (or query parameters), with the same names, types and limits, and its result is the object the endpoint returns. The endpoint pages are the full reference for both. The examples on this page illustrate test-mode responses, using Maya Okafor’s fictional license lic_97bb8qgh1b9zk81anbjkmprxh4 (see Sandbox), so their objects have livemode: false. Every result is returned as structured content and as the same JSON in a text block. When the API returns an error, the tool result has isError: true and holds the problem details, with its code. A deny or escalate is not an error: it is a normal result with a decision. The four tools that change data take a required idempotency_key, which the server sends as the endpoint’s Idempotency-Key. Use a new value for each new use and the same value when a client retries the call, so a retry returns the first result instead of checking, submitting or reporting twice. Each tool’s definition is the JSON that tools/list returns, with its input schema and annotations.

resolve_talent

Finds which talent a prompt, image or voice sample invokes. Calls Resolve talent. Scope talent:read.
Returns a resolution:
status: none means no protected talent was found. It is not permission; check_use still decides.
As tools/list returns it. Its outputSchema is the JSON Schema of the Resolution object that POST /v1/resolutions returns.

check_use

Decides whether a use may proceed, before anything is generated. Calls Create a check. Scope checks:write.
Returns a check. The fields an agent acts on:
On allow, pass authorization.token to the generation tool with the same inputs, and add every generation_instructions entry to what it receives. On deny, show reasons[].sentence; if remedy.type is license_request or license_change, offer request_license. On escalate, tell the user the request is with the talent’s reviewer, and read the outcome later with get_check. An agent that cannot come back to a conversation passes on_escalate: "deny".
As tools/list returns it. Its outputSchema is the JSON Schema of the Check object that POST /v1/checks returns.

submit_generation

Checks an output before anyone sees it. Calls Create a generation. Scope generations:write.
Returns a generation:
Deliver the output only when decision is allow, after you embed c2pa as described in C2PA assertion. Video and longer audio return status: "checking"; read the decision with get_generation, or receive it as a webhook to your platform.
As tools/list returns it. Its outputSchema is the JSON Schema of the Generation object that POST /v1/generations returns.

get_check

Reads a check, to follow an escalation to its decision. Calls Retrieve a check. Scope checks:write.
Returns the check. While a reviewer has it, status is escalated and escalation.expires_at says when it becomes a deny. Once decided, decision is allow with an authorization, or deny with reasons. Read it at most once every 5 seconds; a reviewer usually answers in hours, not seconds, so a longer interval is better.
As tools/list returns it. Its outputSchema is the JSON Schema of the Check object that GET /v1/checks/{check_id} returns.

get_generation

Reads a generation, to collect the decision on a video, longer audio or a held output. Calls Retrieve a generation. Scope generations:write.
Returns the generation. status moves from checking or held to allowed, released or denied. Deliver on allowed or released only, with the c2pa assertion embedded.
As tools/list returns it. Its outputSchema is the JSON Schema of the Generation object that GET /v1/generations/{generation_id} returns.

get_license

Reads one license. Calls Retrieve a license. Scope licenses:read.
Returns a license, with its status, handle, current_revision, terms_digest and normalized scope:
As tools/list returns it. Its outputSchema is the JSON Schema of the License object that GET /v1/licenses/{license_id} returns.

list_licenses

Lists the licenses the account holds or may use. Calls List licenses. Scope licenses:read.
Returns a list of licenses: data, has_more and next_cursor.
As tools/list returns it. Its outputSchema is the JSON Schema of the LicenseList object that GET /v1/licenses returns.

request_license

Asks a talent for a new license, or a wider one. Calls Request a license. Scope license_requests:write.
Returns a license request with status: "sent":
A request changes nothing by itself. The talent or their representative answers it, and may change any term; only their signature makes a license or a new revision. The licensee then accepts it at the license’s acceptance_url, where a person on the licensee’s side signs. No tool can sign or accept a license.
As tools/list returns it. Its outputSchema is the JSON Schema of the LicenseRequest object that POST /v1/license_requests returns.

report_usage

Reports usage for generations and sessions. Calls Report usage. Scope usage:write.
Returns a list of usage records, each accepted or rejected with a rejection.code.
As tools/list returns it. Its outputSchema is the JSON Schema of the UsageRecordList object that POST /v1/usage_records returns.

verify_receipt

Verifies a receipt, a manifest or a file, and returns the receipt it matches with its live status. Calls Verify content. No scope is needed. Send exactly one argument:
Returns a verification:
result: "not_found" says nothing about whether the content is licensed. invalid means a receipt or manifest is present and fails verification.
As tools/list returns it. Its outputSchema is the JSON Schema of the Verification object that POST /v1/verifications returns.

MCP server

Proposed transport, OAuth and scopes.

Agent integration design

A check, a token and a generation tool, end to end.