crosscheck
Checks for AI agents over x402: review drafts, accept-check handoffs, scan skills before install.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"crosscheck": {
"command": "npx",
"args": [
"crosscheckapi"
]
}
}
}Runnable packages
0.6.0stdioRemote endpoints
https://crosscheckapi.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (8)
🟢check(draft, request, sources, source_urls, fetch_cited, ...)
Independent review of a draft (email, report, summary, PR description) before its human sees it. Returns pass or specific issues with fixes; arithmetic is recomputed in code. With request (what the human asked), it also checks the draft answers that. With sources, each claim is checked against them and quotes are verified; with source_urls or fetch_cited, crosscheck fetches up to 3 web pages itself and checks against those (+$0.01 a page, and a dead link the draft gives fails it). $0.02. Paid per call in USDC over x402 (Base, or free test USDC on Base Sepolia). An x402-aware MCP client pays automatically: the first call returns the price as an x402 PaymentRequired error, and the retry carries the payment in _meta["x402/payment"]. Without one, use the npm client `npx -y crosscheckapi`, which pays from a wallet you set.
Input Schema
{
"type": "object",
"properties": {
"draft": {
"type": "string",
"description": "The draft text to review",
"maxLength": 48000
},
"request": {
"type": "string",
"description": "Optional: what the human asked for, word for word if you have it. The reviewer then also checks that the draft answers it (a missed question, a changed scope, a wrong period)",
"maxLength": 8000
},
"sources": {
"type": "array",
"maxItems": 10,
"description": "Optional texts the draft relies on; turns on grounding",
"items": {
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "Source text"
},
"title": {
"type": "string",
"description": "Optional title"
},
"url": {
"type": "string",
"description": "Optional URL"
}
},
"required": [
"text"
]
}
},
"source_urls": {
"type": "array",
"maxItems": 3,
"items": {
"type": "string",
"description": "A public http or https URL"
},
"description": "Optional: up to 3 web pages crosscheck fetches after payment and checks the draft against, as sources. +$0.01 each"
},
"fetch_cited": {
"type": "boolean",
"description": "Optional: also fetch the links the draft itself cites (up to 3 pages in all, +$0.01 each); a link that is gone fails the draft"
},
"open_review": {
"type": "boolean",
"description": "Optional: let a qualified outside reviewer take the job (not routed yet; crosscheck's reviewer does it and the receipt says so)"
},
"moltbook_identity": {
"type": "string",
"description": "Optional: a Moltbook identity token for the free tier, when it is on (a verified Moltbook agent gets free checks with no payment). Not stored. Without a free check left, the price comes back as usual"
},
"ref": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Optional: the hash of a crosscheck receipt that brought you here. Its wallet earns check credits from your first 90 days of spend."
}
},
"required": [
"draft"
]
}⚪accept(task, deliverable, reference, payment_tx, payment_network, ...)
Checks work another agent handed back against the task it was given, before you pay, release escrow, or pass it on. Returns accept, reject, or verify_externally with every requirement judged; counts, required JSON fields, and sums are checked in code. Optional payment_tx is verified on chain. $0.03 base. Paid per call in USDC over x402 (Base, or free test USDC on Base Sepolia). An x402-aware MCP client pays automatically: the first call returns the price as an x402 PaymentRequired error, and the retry carries the payment in _meta["x402/payment"]. Without one, use the npm client `npx -y crosscheckapi`, which pays from a wallet you set.
Input Schema
{
"type": "object",
"properties": {
"task": {
"type": "string",
"description": "The task as given to the other agent"
},
"deliverable": {
"type": "string",
"description": "What came back"
},
"reference": {
"type": "string",
"description": "Optional reference material the task points to"
},
"payment_tx": {
"type": "string",
"description": "Optional transaction hash of the payment for this work"
},
"payment_network": {
"type": "string",
"description": "Network of payment_tx, for example eip155:8453"
},
"ref": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Optional: the hash of a crosscheck receipt that brought you here. Its wallet earns check credits from your first 90 days of spend."
}
},
"required": [
"task",
"deliverable"
]
}⚪skillcheck(files, fresh, ref)
Security review of a skill or MCP server's files before you install or connect it: read, never run. Free when these exact files were scanned before (looked up by bundle hash); otherwise paid, $0.03 base. Never says safe. Paid per call in USDC over x402 (Base, or free test USDC on Base Sepolia). An x402-aware MCP client pays automatically: the first call returns the price as an x402 PaymentRequired error, and the retry carries the payment in _meta["x402/payment"]. Without one, use the npm client `npx -y crosscheckapi`, which pays from a wallet you set.
Input Schema
{
"type": "object",
"properties": {
"files": {
"type": "array",
"minItems": 1,
"maxItems": 200,
"description": "Every text file of the skill or server, docs included; code rules read all of them",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Path inside the skill"
},
"content": {
"type": "string",
"description": "File content"
}
},
"required": [
"path",
"content"
]
}
},
"fresh": {
"type": "boolean",
"description": "Scan again even when a past scan of these exact files exists"
},
"ref": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "Optional: the hash of a crosscheck receipt that brought you here. Its wallet earns check credits from your first 90 days of spend."
}
},
"required": [
"files"
]
}⚪sellercheck(resource, method, network)
For x402 sellers: one dated report on your own paid resource, by code alone. Does it answer a valid 402 (v1 or v2: price, network, payTo), is it in the x402 Bazaar index, would agent402's router route to it, and how many USDC settlements reached its payTo on Base in 24 hours and 7 days. Nothing is paid to the resource. $0.05. Paid per call in USDC over x402 (Base, or free test USDC on Base Sepolia). An x402-aware MCP client pays automatically: the first call returns the price as an x402 PaymentRequired error, and the retry carries the payment in _meta["x402/payment"]. Without one, use the npm client `npx -y crosscheckapi`, which pays from a wallet you set.
Input Schema
{
"type": "object",
"properties": {
"resource": {
"type": "string",
"description": "The full URL of your x402 resource (public http or https)",
"maxLength": 300
},
"method": {
"type": "string",
"enum": [
"GET",
"POST"
],
"description": "Optional: the method it is paid with; default tries GET, then POST"
},
"network": {
"type": "string",
"enum": [
"eip155:8453"
],
"description": "Optional: Base, the only network read today"
}
},
"required": [
"resource"
]
}⚪sellerwatch(resource, method, network, notify)
For x402 sellers: sellercheck every hour for 30 days on one resource, paid once. An alert to your webhook (JSON POST) or ntfy topic only when something changes: the 402 breaks or its price or payTo change, it leaves or rejoins the Bazaar index, agent402's router flips, settlements start, double, or halve, or it is down twice in a row. Returns a public record page to link from your listing. $1. Paid per call in USDC over x402 (Base, or free test USDC on Base Sepolia). An x402-aware MCP client pays automatically: the first call returns the price as an x402 PaymentRequired error, and the retry carries the payment in _meta["x402/payment"]. Without one, use the npm client `npx -y crosscheckapi`, which pays from a wallet you set.
Input Schema
{
"type": "object",
"properties": {
"resource": {
"type": "string",
"description": "The full URL of your x402 resource (public http or https)",
"maxLength": 300
},
"method": {
"type": "string",
"enum": [
"GET",
"POST"
],
"description": "Optional: the method it is paid with; default tries GET, then POST"
},
"network": {
"type": "string",
"enum": [
"eip155:8453"
],
"description": "Optional: Base, the only network read today"
},
"notify": {
"type": "object",
"description": "Where alerts go, at least one: webhook (a public https URL) and/or ntfy (an ntfy.sh topic)",
"properties": {
"webhook": {
"type": "string",
"description": "A public https URL"
},
"ntfy": {
"type": "string",
"description": "An ntfy.sh topic",
"maxLength": 64
}
}
}
},
"required": [
"resource",
"notify"
]
}⚪skillcheck_lookup(bundle_sha256)
Free. The latest skillcheck of an exact bundle, by its bundle_sha256 (SHA-256 of the canonical JSON of the files sorted by path, each as {path, sha256}).
Input Schema
{
"type": "object",
"properties": {
"bundle_sha256": {
"type": "string",
"pattern": "^[0-9a-f]{64}$"
}
},
"required": [
"bundle_sha256"
]
}🟢verify_receipt(receipt_hash, receipt, draft, request, sources, ...)
Free. Before trusting work that arrives with a crosscheck receipt, check in code that crosscheck issued it, its signature is valid, what the outcome was, and that it covers exactly the text you were handed. Pass receipt_hash (or the receipt object) plus that text: draft, request, and sources for check, task and deliverable for accept, files for skillcheck, and the verdict if one came with it.
Input Schema
{
"type": "object",
"properties": {
"receipt_hash": {
"type": "string",
"pattern": "^[0-9a-f]{64}$",
"description": "The receipt's hash (the last part of its /r/ proof link)"
},
"receipt": {
"type": "object",
"description": "Or the whole receipt object {body, hash, sig}"
},
"draft": {
"type": "string",
"description": "check: the draft the receipt should cover"
},
"request": {
"type": "string",
"description": "check: the human's request, if the check had one"
},
"sources": {
"type": "array",
"description": "check: the sources, if the check had any, in the same order (strings or {text})"
},
"task": {
"type": "string",
"description": "accept: the task the receipt should cover"
},
"deliverable": {
"type": "string",
"description": "accept: the deliverable the receipt should cover"
},
"files": {
"type": "array",
"description": "skillcheck: the skill's files",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Path inside the skill"
},
"content": {
"type": "string",
"description": "File content"
}
},
"required": [
"path",
"content"
]
}
},
"verdict": {
"type": "object",
"description": "The verdict that came with the receipt, to confirm nobody edited it"
}
}
}⚪result(job_id, result_token)
Free. Status, verdict, and signed receipt of an earlier paid call that was still running, using the job_id and result_token it returned.
Input Schema
{
"type": "object",
"properties": {
"job_id": {
"type": "string",
"description": "job_id from the paid call"
},
"result_token": {
"type": "string",
"description": "result_token from the paid call"
}
},
"required": [
"job_id",
"result_token"
]
}Community
Evidence