Read-only ChainChoice rankings: sourced, dated comparisons of crypto services, with evidence.
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.
For one category (and optionally one product id): each criterion, its weight, and per product the score with the quoted passage, its source URL and the day it was read.
A category id from list_categories, e.g. "exchange" or "hardware_wallet".
A product id from get_ranking (optional).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http rankings https://chainchoice.io/mcp
For one category (and optionally one product id): each criterion, its weight, and per product the score with the quoted passage, its source URL and the day it was read.
| Argument | Type | Description |
|---|---|---|
| product | string | A product id from get_ranking (optional). |
| category* | string | A category id from list_categories, e.g. "exchange" or "hardware_wallet". |
{
"type": "object",
"required": [
"category"
],
"properties": {
"product": {
"type": "string",
"description": "A product id from get_ranking (optional)."
},
"category": {
"type": "string",
"description": "A category id from list_categories, e.g. \"exchange\" or \"hardware_wallet\"."
}
},
"additionalProperties": false
}The published order of one category: rank, product id, name and ChainChoice Score, with the methodology version, the dimension weights and what was assessed. The same order the category page and rankings.json publish.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many rows, from the top (default 10). |
| category* | string | A category id from list_categories, e.g. "exchange" or "hardware_wallet". |
{
"type": "object",
"required": [
"category"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many rows, from the top (default 10)."
},
"category": {
"type": "string",
"description": "A category id from list_categories, e.g. \"exchange\" or \"hardware_wallet\"."
}
},
"additionalProperties": false
}The category's products as a reader in one country sees them: those available there, in order, with each one's published score and rank beside it. When nothing passes the country's availability filter, resultMode is "fallback" and the rows are the published order, none confirmed for that country.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many rows, from the top (default 10). |
| country* | string | ISO 3166-1 alpha-2, e.g. "DE". |
| category* | string | A category id from list_categories, e.g. "exchange" or "hardware_wallet". |
{
"type": "object",
"required": [
"category",
"country"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many rows, from the top (default 10)."
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "ISO 3166-1 alpha-2, e.g. \"DE\"."
},
"category": {
"type": "string",
"description": "A category id from list_categories, e.g. \"exchange\" or \"hardware_wallet\"."
}
},
"additionalProperties": false
}Once the reader has agreed to go to a provider (consent: true), returns what to hand over: the provider's own address as ChainChoice's catalog records it (never a referral or affiliate link; ChainChoice earns nothing from it), the product's published rank and ChainChoice Score, the reader's country and monthly volume, the ranked list's page with that setup, whether the provider serves that country, and a receipt signed with ChainChoice's published key (check it with verify_receipt) recording exactly what was handed over. A provider that does not serve the reader's country is not handed off: handedOff is false with the reason. It does not open anything, log the reader or change any ranking.
| Argument | Type | Description |
|---|---|---|
| vol | integer | The reader's monthly amount (optional). |
| query | string | The reader's words, if the hand-off follows a search (optional, kept in the receipt). |
| consent* | boolean | true only once the reader has agreed to be sent to this provider. |
| country | string | The reader's country, ISO 3166-1 alpha-2, e.g. "DE" (optional). |
| product* | string | A product id from get_ranking or a search answer. |
| category* | string | A category id from list_categories, e.g. "exchange" or "hardware_wallet". |
Every category ChainChoice ranks, with how many products it ranks, how many it assessed and left out with a reason, its leader, and its page.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Reads a query exactly as ChainChoice's search bars do (the same resolver as the homepage, the navigation field and the command palette) and returns that reading: the page it opens (a category's ranked list with the country, monthly volume, sort and filters read from the words, a product's verdict, a two-product compare, a guide), or the question it asks with at most three options, each with the page it opens; `answer`, the card the bars show before a page opens (the published #1 or the named product, its ChainChoice Score and rank, the margin, why it leads, its main trade-off, the list's page and a link to watch it), every figure from the published ranking; `readBy` when a model read a sentence the rules could not (only while ChainChoice's model tier is on and released by its measured eval); plus `open`, the homepage address that runs the same search. `country` applies a reader's country to a ranked list when the words name none; a country in the words wins. Nobody pays for a place in any answer.
| Argument | Type | Description |
|---|---|---|
| query* | string | The words a reader would type, e.g. "kraken or coinbase" or "best exchange for a German user". |
| country | string | ISO 3166-1 alpha-2, e.g. "DE" (optional). |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "The words a reader would type, e.g. \"kraken or coinbase\" or \"best exchange for a German user\"."
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "ISO 3166-1 alpha-2, e.g. \"DE\" (optional)."
}
},
"additionalProperties": false
}Checks a signed receipt (as ChainChoice serves it, or an issuer envelope) against the keys ChainChoice publishes: whether its content hash matches and its signature is valid. The same verifier as POST /api/v1/verify.
| Argument | Type | Description |
|---|---|---|
| receipt* | object | The receipt JSON, with its signature. |
{
"type": "object",
"required": [
"receipt"
],
"properties": {
"receipt": {
"type": "object",
"description": "The receipt JSON, with its signature."
}
},
"additionalProperties": false
}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 4, 2026.
{
"type": "object",
"required": [
"category",
"product",
"consent"
],
"properties": {
"vol": {
"type": "integer",
"maximum": 10000000,
"minimum": 1,
"description": "The reader's monthly amount (optional)."
},
"query": {
"type": "string",
"maxLength": 120,
"description": "The reader's words, if the hand-off follows a search (optional, kept in the receipt)."
},
"consent": {
"type": "boolean",
"const": true,
"description": "true only once the reader has agreed to be sent to this provider."
},
"country": {
"type": "string",
"pattern": "^[A-Z]{2}$",
"description": "The reader's country, ISO 3166-1 alpha-2, e.g. \"DE\" (optional)."
},
"product": {
"type": "string",
"description": "A product id from get_ranking or a search answer."
},
"category": {
"type": "string",
"description": "A category id from list_categories, e.g. \"exchange\" or \"hardware_wallet\"."
}
},
"additionalProperties": false
}