{"skill":{"slug":"bestchange","displayName":"BestChange","summary":"Find trusted BestChange exchangers for crypto-to-fiat and e-currency exchange requests using the hosted BestChange MCP tool. Use when users ask for current B...","description":"---\nname: bestchange\ndescription: >\n  Find trusted BestChange exchangers for crypto-to-fiat and e-currency exchange\n  requests using the hosted BestChange MCP tool. Use when users ask for current\n  BestChange options or exchanger rankings.\nhomepage: https://bestchange-mcp.krutovoy.me\nversion: 0.1.2\ncategory: finance\nemoji: \"💱\"\nauthor: Roman Krutovoy\nauthor_url: https://krutovoy.me\nmetadata:\n  openclaw:\n    requires:\n      env: []\n      bins: []\n    endpoints:\n      - https://bestchange-mcp.krutovoy.me/mcp\n---\n\n# BestChange\n\nUse this skill when the user asks for exchanger options through BestChange.\n\nThis file is the full agent contract. Do not rely on README files, source code, or guessed BestChange codes.\n\n## Prerequisites\n\nThis skill requires the hosted BestChange MCP server to be connected in the agent client. Installing the skill only installs these instructions; it does not automatically register the MCP server in every agent.\n\nMCP endpoint:\n\n```text\nPOST https://bestchange-mcp.krutovoy.me/mcp\n```\n\nClaude Code setup:\n\n```bash\nclaude mcp add --transport http bestchange https://bestchange-mcp.krutovoy.me/mcp\nclaude mcp list\n```\n\nThen restart Claude Code or run `/mcp` inside Claude Code and confirm the `bestchange` server is connected.\n\nExpected MCP tools:\n\n1. `bestchange_search_currencies`: find exact BestChange currency codes from user-facing names.\n2. `bestchange_top_exchangers`: request ranked exchangers with exact `from_code` and `to_code`.\n3. `bestchange_report_blocker`: report blocked tasks after using the available tools.\n\nIf these tools are not available, do not invent rates, reserves, exchanger names, or links. Tell the user:\n\n```text\nThe BestChange skill is installed, but the BestChange MCP server is not connected in this agent client, so I cannot fetch live rates. Connect it with: claude mcp add --transport http bestchange https://bestchange-mcp.krutovoy.me/mcp, then restart the agent or check /mcp.\n```\n\nDo not use natural-language pair parsing as the main flow.\n\n## Tool Flow\n\nFor a user request like `20 usdc base to revolut eur`:\n\n1. Search the source currency:\n\n```json\n{\n  \"name\": \"bestchange_search_currencies\",\n  \"arguments\": {\n    \"search\": \"usdc base\",\n    \"limit\": 10,\n    \"rationale\": \"Find the exact BestChange source code for the user's requested source asset/network.\"\n  }\n}\n```\n\n2. Search the destination currency:\n\n```json\n{\n  \"name\": \"bestchange_search_currencies\",\n  \"arguments\": {\n    \"search\": \"revolut eur\",\n    \"limit\": 10,\n    \"rationale\": \"Find the exact BestChange destination code for the user's requested payout rail/currency.\"\n  }\n}\n```\n\n3. Pick the exact codes from the results. If either side is ambiguous, ask the user to choose; do not guess.\n   If either side has no matches, tell the user that BestChange does not list that currency/rail in the current API data and that you cannot return exchanger options for it.\n\n4. Request exchanger options:\n\n```json\n{\n  \"name\": \"bestchange_top_exchangers\",\n  \"arguments\": {\n    \"amount\": 20,\n    \"from_code\": \"USDCBASE\",\n    \"to_code\": \"REVOLUTEUR\",\n    \"limit\": 10,\n    \"rationale\": \"Quote the exact pair after resolving both BestChange currency codes.\"\n  }\n}\n```\n\nUse the actual codes returned by `bestchange_search_currencies`; the codes above are examples of the expected shape, not a promise that these exact codes exist.\n\nIf `bestchange_top_exchangers` returns `options: []`, inspect `diagnostics` before answering:\n\n- `pair_available: false`: the exact pair is not available in current BestChange API data.\n- `pair_available: true` and `amount_compatible_count: 0`: the pair exists, but the requested amount is outside visible exchanger limits. Mention `min_input_amount` and/or `max_input_amount` when present.\n- `pair_available: true`, amount-compatible rows exist, but reserve-compatible rows are zero: the pair exists, but visible reserves are insufficient for the requested amount.\n- If diagnostics do not explain the empty result, say no exchanger options passed the current filters and avoid guessing a cause.\n\n## Tool Parameters\n\n`bestchange_search_currencies`:\n\n- `search` string, required. Human-facing currency text such as `usdc base`, `usdt ton`, `revolut eur`, or `monobank uah`. Why needed: BestChange uses exact internal currency codes and agents must discover them instead of guessing.\n- `limit` number or string, optional, default `20`. Why needed: keeps candidate lists short enough to inspect.\n- `rationale` string, optional. Why needed: records why this lookup was necessary for debugging repeated failures.\n\n`bestchange_top_exchangers`:\n\n- `amount` number or string, required. Amount the user gives in the source currency. Why needed: BestChange rates have `inmin` / `inmax` limits and output reserve checks.\n- `from_code` string, required. Exact BestChange source currency code returned by `bestchange_search_currencies`. Why needed: selects the precise token/network.\n- `to_code` string, required. Exact BestChange destination currency code returned by `bestchange_search_currencies`. Why needed: selects the precise bank/rail/fiat target.\n- `limit` number or string, optional, default `10`. Why needed: controls how many ranked exchanger options are returned.\n- `rationale` string, optional. Why needed: records the user's intent for debugging empty results and product improvements.\n\n`bestchange_report_blocker`:\n\n- `user_task` string, required. The user's original request. Why needed: preserves intent for later analysis.\n- `blocker` string, required. Concrete failure reason, such as missing currency, ambiguous candidates, no pair, amount below minimum, or insufficient diagnostics.\n- `what_tried` string, optional. Tool searches/calls already attempted.\n- `rationale` string, optional. Why the agent stopped instead of guessing.\n- `missing_capability` string, optional. Tool/data that would have helped.\n\n## Pair Finding\n\nThe server uses only the official BestChange API v2. It does not scrape BestChange pages.\n\nPair finding order:\n\n1. Use `bestchange_search_currencies` for each side.\n2. Choose exact BestChange `code` values only when the result is unambiguous.\n3. Call `bestchange_top_exchangers` with `amount`, `from_code`, and `to_code`.\n4. If there are no matches, or multiple plausible matches, ask the user for clarification.\n\n## Trust Policy\n\nShow the top 10 options unless the user asks for a smaller limit.\n\nThe ranking flow is:\n\n1. Keep amount-compatible exchangers first, using BestChange `inmin` and `inmax`.\n2. For fiat outputs, require reserve to cover the estimated output when BestChange provides reserve.\n3. Prefer exchangers with `claim == 0` and more than 50 positive reviews.\n4. If none match, fallback to clean newcomers with `claim == 0`.\n5. If none match, fallback to all amount-compatible exchangers.\n6. Sort returned options by best estimated output.\n\n## Response Rules\n\n- Do not invent rates, reserves, exchanger names, IDs, links, or expiry times.\n- Do not invent BestChange currency codes.\n- Make clear that results depend on live BestChange API data.\n- Include exchanger display names, estimated output, reserve if present, review counts, trust bucket, and referral URL.\n- Referral URLs must preserve the exact resolved route through BestChange click parameters: `id`, `from`, `to`, `city=0`, and `p`. Do not replace them with a generic exchanger homepage or a click URL missing the exact `from` / `to` IDs.\n- If the BestChange MCP service is unavailable, report the structured error instead of fabricating options.\n- If a searched currency is absent, use this shape: `I could not find <requested currency> in current BestChange currency data, so I cannot quote this route through BestChange. <destination/source> was found as <code> if relevant.`\n- If a pair exists but amount is too small, use this shape: `BestChange lists <from_code> -> <to_code>, but I do not see exchangers accepting <amount>. The visible minimum input amount is <min_input_amount>.`\n- When blocked after using the tools, call `bestchange_report_blocker` before replying if it will not slow down the user-facing response.\n\n## Response Formatting\n\nReply in the user's conversation language. Use the structure below for successful quotes, adapting labels and prose to that language.\n\nKeep the answer compact and decision-oriented:\n\n1. Start with a short line saying the result comes from live BestChange API data.\n2. Show the exact route as a bold heading.\n3. Highlight the best option first with exchanger name, estimated output, rate, reserve, reviews, claim, and route-specific referral URL.\n4. Explain briefly why this option is preferred.\n5. Show 2-3 backup options in a smaller format.\n6. End with a short pre-send checklist that repeats the exact network/code and payout rail.\n\nExample shape, with live values and links replaced by the actual tool response:\n\n```text\nAccording to the live BestChange API, the best exchange right now is:\n\n**800 USDTTON -> Monobank UAH**\n\n**DigiChanger** ✅\n**≈ 34,582.28 UAH**\nRate: **43.2279**\nReserve: **1.29B UAH**\nReviews: **245 positive**, claim **0**\n\nhttps://www.bestchange.com/click.php?id=1160&from=313&to=84&city=0&p=1341676\n\nI would choose **DigiChanger**: it is first by estimated payout, accepts the requested amount, and is in the primary trust bucket.\n\n**Backup options**\n\n**2. PocketBank**\n≈ 34,401.37 UAH\nRate: 43.0017\nReserve: 518.8M UAH\nReviews: 60\nhttps://www.bestchange.com/click.php?id=1030&from=313&to=84&city=0&p=1341676\n\n**3. ObmenMoney**\n≈ 34,401.34 UAH\nRate: 43.0017\nReserve: 4.3M UAH\nReviews: 580\nhttps://www.bestchange.com/click.php?id=609&from=313&to=84&city=0&p=1341676\n\nBefore sending:\n\n🔒 **Network:** TON / `USDTTON`\n💳 **Card:** Monobank UAH, without recipient details being auto-replaced\n```\n","tags":{"bestchange":"0.1.2","exchange":"0.1.2","finance":"0.1.2","latest":"0.1.2","mcp":"0.1.2"},"stats":{"comments":0,"downloads":389,"installsAllTime":14,"installsCurrent":0,"stars":0,"versions":3},"createdAt":1777959561833,"updatedAt":1778492850251},"latestVersion":{"version":"0.1.2","createdAt":1777975739816,"changelog":"Document MCP setup and remove backend API-key guidance from public skill.","license":"MIT-0"},"metadata":{"setup":[],"os":null,"systems":null},"owner":{"handle":"swiftadviser","userId":"s17843hzyx58twtxnacc3edd3h83k4fk","displayName":"Roman","image":"https://avatars.githubusercontent.com/u/5148967?v=4"},"moderation":null}