Guide: the Provenance MCP server
Add Provenance to Claude (or any MCP-capable agent) in about two minutes — no code. The @provenance/mcp-server package exposes Authorize and Attest as Model Context Protocol tools, so an agent can authorize actions, resolve step-up approvals, revoke intent, and check claim provenance conversationally.
This is the inverse of the framework adapters: those gate your tools with Authorize; this publishes our API as tools you can call.
The tools
| Tool | Does | Mutates? |
| --- | --- | --- |
| authorize_action | Mint an intent token for an action an agent is about to take | yes |
| verify_intent | Verify a token before executing; may return an awaiting-approval result | yes |
| check_approval_status | Look up a step-up approval by id | no |
| revoke_intent | Revoke a token / session / device | yes |
| get_policy | Read the active authorization (or claims_risk) policy | no |
| simulate_policy | Evaluate facts against a policy without changing anything | no |
| check_claim_provenance | Fetch an Attest claim's provenance + risk score | no |
| verify_attestation | Verify a stored attestation by id | no |
| get_usage | Read the account's metered usage + allowance | no |
| trace_decision | Attribution trace for a traced inference (submits a metered job, waits, returns the signed manifest) | yes |
Each tool is a thin wrapper over one @provenance/sdk call. Scope and plan limits stay server-side — a tool can only do what the API key it runs under can already do. The server holds no secret beyond that key.
Pending approvals never hang
When a policy requires human step-up approval, verify_intent returns a structured "awaiting human approval (id …, expires …)" result instead of blocking past the client's timeout. The agent surfaces it, and either polls check_approval_status or re-runs verify_intent once the human approves.
Connect over stdio (local, npx)
Add this to your Claude Desktop / Claude Code MCP config (see examples/claude-config.json):
{
"mcpServers": {
"provenance": {
"command": "npx",
"args": ["-y", "@provenance/mcp-server"],
"env": {
"PROVENANCE_API_KEY": "prv_test_…",
"PROVENANCE_BASE_URL": "https://api.provenance.example"
}
}
}
}
PROVENANCE_API_KEY is required; PROVENANCE_BASE_URL overrides the default hosted API (point it at your local sandbox for testing). The key travels only in the environment — never on the command line, where it would leak into ps.
Connect over HTTP (hosted, no install)
The API also mounts the MCP Streamable-HTTP transport at POST /v1/mcp. Point an HTTP-capable MCP client there and authenticate with your API key:
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://api.provenance.example/v1/mcp"),
{ requestInit: { headers: { Authorization: `Bearer ${process.env.PRV_KEY}` } } },
);
const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(transport);
const { tools } = await client.listTools(); // the ten tools above
await client.callTool({ name: "get_usage", arguments: {} });
A hosted tool call is just an API call: it runs through the same rate limits, scope checks, plan gates, and usage metering as a direct HTTP request — nothing is bypassed.
Try it
> Authorize a $500 wire to Acme, then verify it.
Claude calls authorize_action then verify_intent; if your policy needs approval you'll get an approval id to resolve. Read-only questions ("what's my usage?", "show the provenance for claim CLM-123") work the same way.