Bitcoin-native MCP server for AI agents: BTC/STX wallets, DeFi yield, sBTC peg, NFTs, and x402 payments.
Server has 30 tools with consistent naming (verb_noun pattern) and descriptions present for all. However, parameter descriptions are often generic or missing detail. Input schemas use Zod validation but lack explicit type/description pairs in many cases. Output schemas are not documented. Error handling is basic (createErrorResponse wrapper). No tool annotations (readOnlyHint/destructiveHint). Risk classifications are declared but not enforced in schema. Several tools accept optional parameters without clear guidance on dependencies or defaults.
Get liquidity pool information from ALEX DEX. Returns reserve balances and pool details for a token pair. Note: ALEX DEX is only available on mainnet.
Get a swap quote from ALEX DEX. Returns the expected output amount for swapping tokenX to tokenY. Use full contract IDs for tokens (e.g., 'SP3K8BC0PPEVCV7NZ6QSRWPQ2JE9E5B6N3PA0KBR9.token-wstx-v2'). Note: ALEX DEX is only available on mainnet.
List all available trading pools on ALEX DEX. Discovers all token pairs that can be swapped directly. Returns pool ID, token pair, and factor (fee tier) for each pool. Use this to find which tokens can be swapped before calling alex_swap. Note: ALEX DEX is only available on mainnet.
Execute a token swap on ALEX DEX. Swaps tokenX for tokenY using the ALEX AMM. Use full contract IDs for tokens. Note: ALEX DEX is only available on mainnet.
Get a swap quote from Bitflow DEX. Returns the expected output amount and route for swapping tokens. Requires BITFLOW_API_KEY environment variable. Note: Bitflow is only available on mainnet.
No output schemas documented. Tools return structured responses (seen in bitcoin.tools.ts: createJsonResponse with balance, confirmed, unconfirmed fields) but LLMs cannot see the expected response structure. This forces agents to infer field names and types, increasing hallucination risk.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Risk classifications are declared in the spec (READ_ONLY, IRREVERSIBLE) but not exposed in MCP tool metadata. LLMs cannot distinguish safe reads from destructive writes without explicit annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Get all possible swap routes between two tokens on Bitflow. Returns all available routes for swapping from tokenX to tokenY. Useful for understanding routing options. Requires BITFLOW_API_KEY environment variable. Note: Bitflow is only available on mainnet.
Get possible swap target tokens for a given input token on Bitflow. Returns all tokens that can be received when swapping from the specified token. Requires BITFLOW_API_KEY environment variable. Note: Bitflow is only available on mainnet.
Get market ticker data from Bitflow DEX. Returns price, volume, and liquidity data for all trading pairs. This endpoint does NOT require an API key. Note: Bitflow is only available on mainnet.
Get all available tokens for swapping on Bitflow. Returns the list of tokens that can be swapped on Bitflow DEX. Requires BITFLOW_API_KEY environment variable. Note: Bitflow is only available on mainnet.
Execute a token swap on Bitflow DEX. Swaps tokenX for tokenY using Bitflow's aggregated liquidity. Requires BITFLOW_API_KEY environment variable. Note: Bitflow is only available on mainnet.
Call a function on a Stacks smart contract. Signs and broadcasts the transaction. For typed arguments, use objects like {type: 'uint', value: 100} or {type: 'principal', value: 'SP...'}. Post conditions constrain what assets the transaction can move. Each condition is an object: - STX: {type: 'stx', principal: 'SP...', conditionCode: 'eq'|'gt'|'gte'|'lt'|'lte', amount: '1000000'} - FT: {type: 'ft', principal: 'SP...', asset: 'SP...contract', assetName: 'token-name', conditionCode: 'eq', amount: '1000'} - NFT: {type: 'nft', principal: 'SP...', asset: 'SP...contract', assetName: 'nft-name', tokenId: '1', notSend?: boolean}
Call a read-only function on a smart contract (no signing required).
Check if a BNS domain name is available for registration.
Register a BNS domain name in a single transaction using name-claim-fast. This is the RECOMMENDED method — no preorder/register wait needed. Burns the name price in STX and mints the BNS NFT atomically. Works for all open namespaces (BNS V2).
Deploy a Clarity smart contract to the Stacks blockchain.
Get detailed information about a BNS domain name.
Get the registration price for a BNS domain name.
Get the BTC balance for a Bitcoin address. Returns both total balance (including unconfirmed) and confirmed balance.
Get current Bitcoin fee estimates for different confirmation targets. Returns fast (~10 min), medium (~30 min), and slow (~1 hour) fee rates in sat/vB.
List all UTXOs (Unspent Transaction Outputs) for a Bitcoin address. Useful for debugging, transparency, and understanding transaction inputs.
Check the status of a Stacks transaction by its txid.
List all BNS domains owned by an address.
Resolve a .btc domain name to its Stacks address.
Preorder a BNS domain name (step 1 of 2-step registration). NOTE: For .btc names, prefer claim_bns_name_fast instead — it registers in one transaction. Use this 2-step flow only for non-.btc namespaces or if claim-fast is unavailable. After preorder is confirmed (~10 minutes), call register_bns_name with the same salt. IMPORTANT: Save the returned salt - you'll need it for the register step!
Register a BNS domain name after preorder is confirmed. This is step 2 of a 2-step process. You MUST use the same salt from the preorder step. Only call this after the preorder transaction has been confirmed on-chain (~10 minutes).
Get the BNS domain names owned by an address.
Transfer BTC to a recipient address. Builds, signs, and broadcasts a Bitcoin transaction. Requires an unlocked wallet with BTC balance. By default, only uses cardinal UTXOs (safe to spend - no inscriptions). Set includeOrdinals=true to allow spending ordinal UTXOs (advanced users only).
Get user's lending position on Zest Protocol. Returns supplied and borrowed amounts for a specific asset. You can use the asset symbol (e.g., 'stSTX') or full contract ID. Note: Zest Protocol is only available on mainnet.
List all supported assets on Zest Protocol. Returns the list of assets that can be supplied, borrowed, or used as collateral. Each asset includes its symbol, name, and contract ID. Use this to discover available assets before supplying or borrowing. Note: Zest Protocol is only available on mainnet.
Supply assets to Zest Protocol lending pool. Deposits assets to earn interest from borrowers. You can use the asset symbol (e.g., 'stSTX') or full contract ID. Note: Zest Protocol is only available on mainnet.
Parameter descriptions lack actionable constraints. Examples: 'amount' in transfer_btc says 'Amount to send in satoshis' but omits min/max bounds; 'slippageTolerance' in bitflow_swap lacks range (0.0 - 1.0?); 'limit' in alex_list_pools has default 50 but no min/max. LLMs cannot validate inputs without explicit bounds.
Error handling is generic. All tools use createErrorResponse(error) wrapper, which likely returns a raw error message or stack trace. No recovery guidance (e.g., 'API key missing, set BITFLOW_API_KEY env var'), no error classification (retryable vs. fatal), no actionable next steps for the LLM.
Optional parameters lack dependency documentation. Examples: transfer_btc's 'includeOrdinals' has a WARNING in description but no guidance on when it's safe; call_contract's 'postConditions' is optional but its interaction with 'postConditionMode' is undocumented. LLMs cannot reason about parameter relationships.