Koskamo

ChainChoice MCP

A read-only MCP server providing access to ChainChoice's deterministic recommendation engine for digital assets. It allows agents to list categories, retrieve product rankings with evidence, verify audit receipts, and perform searches for crypto services like exchanges and wallets without requiring authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

ChainChoice MCP logo, by Simi Ventures GmbHVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Simi Ventures GmbH
MCP endpoint (Streamable HTTP)
https://chainchoice.io/mcp
Vendor documentation

What its tools do

7 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

7 of 7 have a description · 7 of 7 declare behavior hints · 6 of 6 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to chainchoice.io ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Retrieve ranked lists of crypto exchanges or wallets by category
  • Verify the integrity of a published ranking using audit receipts
  • Search for specific crypto products and get top recommendations
  • Get detailed evidence and scores for a specific provider

Source and maintenance

Vendor evidenceRegistry 1.5.0

Protocol and capabilities

Server
io.chainchoice/rankings 1.5.0
MCP protocol negotiated in check
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Read-only access to ChainChoice's published comparison data: the categories, each category's published ranking, the order for a reader in one country, the quoted evidence behind each score, receipt verification, and search: the reading the site's own search bars give a query, with the page it opens. Every figure is CC-BY-4.0; cite ChainChoice (https://chainchoice.io) and the category page the tool returns.

Tools

7 advertised

list_categories — List the ranked categories
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

list_categories input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_categories annotations
{
  "title": "List the ranked categories",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_ranking — Get a category's published ranking
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_ranking input schema
{
  "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
}
get_ranking annotations
{
  "title": "Get a category's published ranking",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_ranking_for_country — Get a category's order for one country
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_ranking_for_country input schema
{
  "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
}
get_ranking_for_country annotations
{
  "title": "Get a category's order for one country",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_evidence — Get the evidence behind a category's scores
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_evidence input schema
{
  "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
}
get_evidence annotations
{
  "title": "Get the evidence behind a category's scores",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
verify_receipt — Verify a ChainChoice receipt
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

verify_receipt input schema
{
  "type": "object",
  "required": [
    "receipt"
  ],
  "properties": {
    "receipt": {
      "type": "object",
      "description": "The receipt JSON, with its signature."
    }
  },
  "additionalProperties": false
}
verify_receipt annotations
{
  "title": "Verify a ChainChoice receipt",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
search — Search ChainChoice as a reader would
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search input schema
{
  "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
}
search annotations
{
  "title": "Search ChainChoice as a reader would",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
hand_off — Hand a reader's decision to the provider
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

hand_off input schema
{
  "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
}
hand_off annotations
{
  "title": "Hand a reader's decision to the provider",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
749 ms
95th percentile latency
749 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 749 ms · metadata changed · 7 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http chainchoice-mcp https://chainchoice.io/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add chainchoice-mcp --url https://chainchoice.io/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable chainchoice-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "chainchoice-mcp": {
      "url": "https://chainchoice.io/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "chainchoice-mcp": {
      "type": "streamableHttp",
      "url": "https://chainchoice.io/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start chainchoice-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "chainchoice-mcp": {
      "type": "http",
      "url": "https://chainchoice.io/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http chainchoice-mcp https://chainchoice.io/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://chainchoice.io/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "chainchoice-mcp": {
      "serverUrl": "https://chainchoice.io/mcp"
    }
  }
}

Let your agent find its tools

Find servers like ChainChoice MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run ChainChoice MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing