
Every receipt wefetch issues. Anyone can verify one.
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.
The signed statement for a month (YYYY-MM): receipts issued, by result, by country and by key id, the receipts that supersede earlier ones, and the chain tip.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http rco https://rco.wefetch.ai/mcp
The signed statement for a month (YYYY-MM): receipts issued, by result, by country and by key id, the receipts that supersede earlier ones, and the chain tip.
| Argument | Type | Description |
|---|---|---|
| month | string |
{
"type": "object",
"properties": {
"month": {
"type": "string",
"default": ""
}
}
}List receipts, newest first, by barcode (subject), country (market) or date (since, YYYY-MM-DD); up to 500.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| since | string | |
| market | string | |
| subject | string |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50
},
"since": {
"type": "string",
"default": ""
},
"market": {
"type": "string",
"default": ""
},
"subject": {
"type": "string",
"default": ""
}
}
}Verify one receipt by id (pm_…), in public: the receipt, its hash, id, signature and chain link checked, the receipts that supersede it, and the public key it was signed under.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
}
}Issue one receipt (issuer credential required, as the credential argument or a Bearer header). subject = the barcode; market; core_version; profile_version; answer_hash; match_hash; result = verified · listed · stale · unknown with the four readings (source_authority, disagreement, freshness, authorisation); supersedes = an earlier receipt id, when this one replaces it. Never revokes.
| Argument | Type | Description |
|---|---|---|
| market* | string | |
| result* | string | |
| subject* | string | |
| freshness* | string | |
| credential | string | |
| match_hash* | string | |
| supersedes | string | |
| answer_hash* | string | |
| verified_at | string | |
| core_version |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 6, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
| string |
| disagreement* | string |
| authorisation* | string |
| profile_version* | string |
| source_authority* | string |
{
"type": "object",
"required": [
"subject",
"market",
"core_version",
"profile_version",
"answer_hash",
"match_hash",
"result",
"source_authority",
"disagreement",
"freshness",
"authorisation"
],
"properties": {
"market": {
"type": "string"
},
"result": {
"type": "string"
},
"subject": {
"type": "string"
},
"freshness": {
"type": "string"
},
"credential": {
"type": "string",
"default": ""
},
"match_hash": {
"type": "string"
},
"supersedes": {
"type": "string",
"default": ""
},
"answer_hash": {
"type": "string"
},
"verified_at": {
"type": "string",
"default": ""
},
"core_version": {
"type": "string"
},
"disagreement": {
"type": "string"
},
"authorisation": {
"type": "string"
},
"profile_version": {
"type": "string"
},
"source_authority": {
"type": "string"
}
}
}