Mark: stamp files with a signed, timestamped provenance record. Hash locally; verify free.
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.
Start a purchase of prepaid stamps for your key (requires API key). Returns `url`: a Stripe Checkout link that a PERSON must open and pay; you cannot pay it yourself. Show the link to your user, then poll get_balance. The stamps land on this key's account and never expire. Packs: 5 for $1.00, 10 for $1.50, 50 for $5.00, 100 for $8.00, 500 for $35.00, 1,000 for $65.00, 2,000 for $120.00 (bundle ids bundle_5, bundle_10, bundle_50, bundle_100, bundle_500, bundle_1000, bundle_2000).
Which pack, e.g. bundle_5 for 5 stamps at $1
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Start a purchase of prepaid stamps for your key (requires API key). Returns `url`: a Stripe Checkout link that a PERSON must open and pay; you cannot pay it yourself. Show the link to your user, then poll get_balance. The stamps land on this key's account and never expire. Packs: 5 for $1.00, 10 for $1.50, 50 for $5.00, 100 for $8.00, 500 for $35.00, 1,000 for $65.00, 2,000 for $120.00 (bundle ids bundle_5, bundle_10, bundle_50, bundle_100, bundle_500, bundle_1000, bundle_2000).
| Argument | Type | Description |
|---|---|---|
| bundle* | string | Which pack, e.g. bundle_5 for 5 stamps at $1 |
{
"type": "object",
"required": [
"bundle"
],
"properties": {
"bundle": {
"enum": [
"bundle_5",
"bundle_10",
"bundle_50",
"bundle_100",
"bundle_500",
"bundle_1000",
"bundle_2000"
],
"type": "string",
"description": "Which pack, e.g. bundle_5 for 5 stamps at $1"
}
}
}Provision a persistent API key with no human, browser, or email in the loop. Call this once, store the returned `secret` (shown only this one time), and use it as the Authorization header on every later call: create_proof, list_proofs, revoke_proof, get_balance, buy_stamps (verify_proof needs no auth). The key owns its own creator id, with no identity attached. Free stamps: one per network, so check `freeStamp` in the result; when it is false, the key needs prepaid stamps (buy_stamps) or x402 payment before its first stamp. Rate-limited to 3 keys per network per day; for 3 free stamps a month or a human-owned account, direct a person to makemark.io/account instead.
| Argument | Type | Description |
|---|---|---|
| label | string | Optional label to recognize this key later, e.g. the agent or project name |
{
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "Optional label to recognize this key later, e.g. the agent or project name"
}
}
}Stamp content with a permanent provenance record. Pass the sha256 hash of the content (hash it locally; the content itself is never uploaded). Returns an instant signed receipt: attach its verifyUrl, byline, badgeEmbed, and qrUrl to the published artifact. The receipt's `publisher` field carries the account's verified identity (domain/handle) or null. If you have no key, call create_account, store its one-time secret, and retry this same call with `Authorization: Bearer <secret>` (its `freeStamp` says whether a free stamp comes with it). If the response is `payment_required` or `quota_exhausted`, call buy_stamps and give a person the returned checkout link (prepaid packs never expire: 5 for $1.00, 10 for $1.50, 50 for $5.00, 100 for $8.00, 500 for $35.00, 1,000 for $65.00, 2,000 for $120.00), poll get_balance until the stamps arrive, then retry. To pay per stamp instead, sign one advertised x402 requirement and send it as a `PAYMENT-SIGNATURE` HTTP header: tool arguments can't carry it, so either configure your MCP client to send that header or POST the same JSON to https://makemark.io/proof directly. An `invalid_api_key` error means the key is mistyped or revoked: create a new one. The optional disclosure fields (aiDisclosure, usageNote, location) only show on `visibility: public` stamps and are unsigned metadata, not part of the cryptographic proof. The stamp asserts provenance from a signer at a time, not authorship truth.
| Argument | Type | Description |
|---|---|---|
| title | string | Optional human-readable title |
| location | string | Optional, creator-opt-in only: where this was made |
| usageNote | string | Optional usage/license line, e.g. "Free to share, with credit" |
| visibility | string | Default private |
Your key's stamp balance (requires API key): plan, included monthly stamps used and remaining, prepaid stamps (`balance`), whether a free stamp is still unused (`lifetimeSampleAvailable`), and recent pack purchases. Poll this after a person pays a buy_stamps link; credits usually arrive within seconds.
No arguments.
{
"type": "object",
"properties": {}
}Grant a specific identity the ability to decrypt escrowed content. Only available for proofs created with content escrow opted in (not yet available — stamps are hash-only today). Returns a capability token the grantee uses with reveal.
| Argument | Type | Description |
|---|---|---|
| proofId* | string | The proof to grant access to |
| granteeId* | string | Identity (did:web: or key fingerprint) to grant |
{
"type": "object",
"required": [
"proofId",
"granteeId"
],
"properties": {
"proofId": {
"type": "string",
"description": "The proof to grant access to"
},
"granteeId": {
"type": "string",
"description": "Identity (did:web: or key fingerprint) to grant"
}
}
}List your recent stamps (requires API key).
| Argument | Type | Description |
|---|---|---|
| limit | number | Max results, default 20 |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max results, default 20"
}
}
}Retrieve escrowed content for a proof you have been granted access to. Only available for proofs created with content escrow opted in (not yet available — stamps are hash-only today). The service re-checks H(content) == stampedHash before returning.
| Argument | Type | Description |
|---|---|---|
| proofId* | string | The proof whose content to reveal |
| capabilityToken* | string | Capability token from grant_access |
{
"type": "object",
"required": [
"proofId",
"capabilityToken"
],
"properties": {
"proofId": {
"type": "string",
"description": "The proof whose content to reveal"
},
"capabilityToken": {
"type": "string",
"description": "Capability token from grant_access"
}
}
}Revoke a stamp you created (forward-only: anchored history stays verifiable, but the proof is marked revoked from now on). Requires API key.
| Argument | Type | Description |
|---|---|---|
| proofId* | string |
{
"type": "object",
"required": [
"proofId"
],
"properties": {
"proofId": {
"type": "string"
}
}
}Verify content against all existing stamps. Pass a sha256 hash; matching is EXACT-BYTES-ONLY. Read the verdict fields: `exact` (these bytes are stamped), each proof's `publisher` (the verified identity: domain/handle + tier, or null meaning an unverified account, never trust a name that isn't in `publisher`), and `conflict` (2+ distinct signers claimed the same bytes; earliest anchored is listed first). A no-match on a re-encoded/screenshotted copy is EXPECTED and is not evidence of fakery: fetch the original and verify that. Free, no auth required.
| Argument | Type | Description |
|---|---|---|
| contentHash* | string | sha256 hex of the content bytes |
{
"type": "object",
"required": [
"contentHash"
],
"properties": {
"contentHash": {
"type": "string",
"description": "sha256 hex of the content bytes"
}
}
}| contentHash* |
| string |
| sha256 hex of the exact content bytes (64 chars) |
| contentType | string | MIME type, e.g. text/markdown |
| aiDisclosure | string | Optional, honest disclosure of AI involvement. Shown on the public record card. |
| canonicalSlug | string | Optional stable slug for a canonical latest-version pointer |
| previousProofId | string | For a new version of already-stamped content: the prior proof id |
{
"type": "object",
"required": [
"contentHash"
],
"properties": {
"title": {
"type": "string",
"description": "Optional human-readable title"
},
"location": {
"type": "string",
"description": "Optional, creator-opt-in only: where this was made"
},
"usageNote": {
"type": "string",
"description": "Optional usage/license line, e.g. \"Free to share, with credit\""
},
"visibility": {
"enum": [
"private",
"public"
],
"type": "string",
"description": "Default private"
},
"contentHash": {
"type": "string",
"description": "sha256 hex of the exact content bytes (64 chars)"
},
"contentType": {
"type": "string",
"description": "MIME type, e.g. text/markdown"
},
"aiDisclosure": {
"enum": [
"Not AI-generated",
"AI-assisted",
"Fully AI-generated"
],
"type": "string",
"description": "Optional, honest disclosure of AI involvement. Shown on the public record card."
},
"canonicalSlug": {
"type": "string",
"description": "Optional stable slug for a canonical latest-version pointer"
},
"previousProofId": {
"type": "string",
"description": "For a new version of already-stamped content: the prior proof id"
}
}
}