Skip to main content
Glama

cardano-defi-mcp — Cardano DeFi taxonomy + MCP server

Open-source proof of concept for the Cardano PRIME grant. Two things in one small package:

  1. A taxonomy index of Cardano DeFi venues — 11 hand-researched venue records (DEXes, lending, CDPs, stablecoins, perps) with categories, assets, capabilities and honest caveats, validated by a zod schema.

  2. An MCP server that gives an AI agent rails into Cardano DeFi: discover venues, get cross-chain swap quotes into ADA, read balances and positions, and receive unsigned transactions the agent signs with its own keys.

The BazaarSwap routing backend is a separate, closed-source service. This repo is only an HTTP client of it (BAZAAR_API_URL); nothing in here does routing, and nothing in here is a wallet.

Quickstart

npm i
cp .env.example .env    # fill in BLOCKFROST_PROJECT_ID; the rest have working defaults
npm test                # vitest, fully mocked — no network
npx tsx src/server.ts   # MCP server on stdio

Environment

Variable

Required for

Default

BLOCKFROST_PROJECT_ID

get_balance, open_cdp, close_cdp

— (clear error if unset)

BAZAAR_API_URL

get_quote, build_swap_tx

http://localhost:3001

LIQWID_GRAPHQL_URL

get_market_data, Liqwid get_position

https://v2.api.liqwid.finance/graphql

CARDANO_NETWORK

Blockfrost / Indigo host selection

mainnet (mainnet | preprod)

INDIGO_API_URL

Indigo get_position

https://analytics.indigoprotocol.io

INDIGO_SYSTEM_PARAMS_URL

open_cdp, close_cdp

— (or INDIGO_SYSTEM_PARAMS_FILE)

Every read tool except get_balance and the Indigo tools works with no API keys at all.

Register with Claude Code

Copy .mcp.json.example to .mcp.json in your project root, fill in the env placeholders, and restart Claude Code. Then /mcp should list cardano-defi-mcp with nine tools.

Related MCP server: agentfi-mcp-server

Tools

Tool

What it does

Funds

list_venues

List/filter indexed venues by category, asset, capability, or free-text query

read-only

get_venue

Full taxonomy record for one venue id

read-only

get_quote

Race the BazaarSwap backend for cross-chain routes; returns best + all by net output

read-only

build_swap_tx

Turn a quoteId into transaction data

unsigned

get_balance

ADA + native-asset balance of a Cardano address (Blockfrost)

read-only

get_position

Indigo CDPs or Liqwid loans for an address (protocol: indigo | liqwid)

read-only

get_market_data

Liqwid supply APY / borrow APR / utilization per market

read-only

open_cdp

Lock ADA collateral, mint an iAsset on Indigo

unsigned

close_cdp

Burn iAsset debt, withdraw ADA collateral on Indigo

unsigned

All tools return { content: [{ type: 'text', text: <pretty JSON> }] }; failures return isError: true with a one-line message and no stack trace.

Security model

  • No keys, ever. The server has no signing code path. For Indigo, the wallet is selected by address only (lucid.selectWallet.fromAddress), which can balance and build a transaction but is structurally incapable of signing one.

  • No funds, ever. Nothing is custodied, pooled or forwarded.

  • No broadcasting. The server never submits a transaction.

  • Unsigned CBOR out. open_cdp / close_cdp return full transaction CBOR hex with an empty witness set — exactly the input a CIP-30 signTx expects — plus a human-readable description of what the transaction does, so the agent (or the human behind it) can check before signing.

  • Secrets come from the environment and are never logged. stdout carries only JSON-RPC; all diagnostics go to stderr.

Limitations (read this before trusting it)

  • Liqwid is read-only. Liqwid v2's supply/borrow/repay actions go through the protocol's off-chain batcher with no documented public transaction-building API or SDK. Building those transactions would mean reverse-engineering an undocumented batcher contract, which is not something a PoC should ship. Rates and loan positions are read live from the public GraphQL API.

  • Indigo's Pyth-oracle path leans on Indigo's analytics API. open_cdp resolves the collateral price oracle from the collateral asset's datum. OracleNft and Delisted are handled directly. Indigo's newer DeferredValidation path needs a signed Pyth Lazer price message, which needs a Pyth Lazer access token this server has no business holding — so it proxies the signed message and the Pyth state UTxO from Indigo's public, unauthenticated analytics API (/api/v3/assets/{iasset}/ada/price, /api/v3/pyth-state/utxo), the same route Indigo's own indigo-mcp takes. Those messages expire 280 s after their timestamp, so the transaction must be signed and submitted promptly after it is built.

  • Indigo needs INDIGO_SYSTEM_PARAMS_URL. The Indigo SDK ships no default SystemParams and Indigo publishes no documented stable URL for the file, so the tools refuse to guess.

  • Indigo position reads use the analytics API, not the SDK. The SDK has no "find CDPs by owner" helper — only datum parsing, which would mean scanning every UTxO at the CDP validator. The analytics endpoint needs no Blockfrost key and returns the CDP out-ref that close_cdp needs.

  • Taxonomy asset lists are directional, not exhaustive. Most venues publish no authoritative pool or market listing, so asset lists are the best-confirmed subset, not a complete index. Each venue's notes field states exactly what was and was not verified — read it rather than treating assets as ground truth.

  • RealFi is not on mainnet yet (testnet at time of research; mainnet stated for late 2026), and its token tickers are unresolved between the live site (USDrf/sUSDrf) and press coverage (USDr/sUSDr). It is indexed for completeness, not because it is usable today.

  • Quotes are live and perishable. get_quote can take up to ~25 s (it waits out a provider race) and quotes expire; build shortly after quoting.

Layout

taxonomy/venues/*.json      one file per venue, validated by VenueSchema
src/taxonomy/               zod schema + loadVenues / listVenues / getVenue / searchVenues
src/adapters/               blockfrost, liqwid, indigo, swap (BazaarSwap API client)
src/tools/                  MCP tool registrations (thin: parse -> adapter -> JSON text)
src/server.ts               McpServer + StdioServerTransport
src/__tests__/              vitest; all network mocked

See DESIGN.md for the module contracts and the top of src/adapters/indigo.ts for where the implementation deviates from the original design and why.

Taxonomy explorer

scripts/build-explorer.mjs renders the venue records into a static page plus a machine-readable taxonomy.json bundle. The output is generated, not committed — docs/ is gitignored.

npm run build:explorer && open docs/index.html   # local preview over file://

The published version is built and deployed to GitHub Pages by .github/workflows/pages.yml on every push to main that touches taxonomy/ or scripts/. This requires the repository's Settings → Pages → Source to be set to GitHub Actions.

Add your protocol

The taxonomy is a community registry — a venue is one JSON file, and adding one takes a PR.

  1. Fork the repo and create a branch named taxonomy/<something> (e.g. taxonomy/add-myvenue) — the PR gate rejects other branch names.

  2. Add taxonomy/venues/<id>.json. The filename (minus .json) must equal the record's id, and the record must match src/taxonomy/schema.ts. Copy an existing file such as taxonomy/venues/minswap.json as a starting point.

  3. Run npm run validate:taxonomy locally — it needs no dependencies and names every problem.

  4. Open a PR. CI validates the file and prints a summary of what changed. A maintainer applies the taxonomy-addition label after review; the PR cannot merge without it.

Keep notes honest: say what you verified and what you did not. Asset lists are expected to be directional rather than exhaustive. On merge, the explorer and taxonomy.json republish automatically.

Try the reference agent

npm run demo runs examples/reference-agent.ts: a minimal MCP client that spawns this server over stdio, lists its tools, and calls list_venues, get_market_data and get_position against live public APIs. No API keys needed; network access is.

Execute a real swap (advanced)

examples/execute-swap.ts is the other half of the story: the agent-side signer. The MCP server quotes and builds but never signs — something outside it has to close the loop, and this example shows what that something looks like. It moves real funds.

Use a burner wallet. Fund it with exactly the amount you intend to trade and nothing more. This is example code for a proof of concept, not a production signer.

npm run execute -- gen      # new burner: appends PRIVATE_KEY to .env.local, prints only the address
npm run execute -- quote    # dry run: warms the API token cache, races quotes (no key needed)
npm run execute -- run      # quote → build → approve → summary, then STOPS
npm run execute -- run --yes  # the same, but signs and broadcasts

Configure the pair with flags or env (.env.local wins over .env): FROM_CHAIN (1 or 42161), FROM_TOKEN (native or an ERC-20 address), AMOUNT (wei), DEST_ADDRESS (addr1…), plus optional TO_CHAIN / TO_TOKEN / SLIPPAGE / RPC_URL.

  • --yes is the only way to broadcast. Without it run prints the exact transaction — sender, target, value, calldata size, estimated ADA out, destination address — and exits with DRY RUN — add --yes to broadcast.

  • ERC-20 sources get an exact-amount approval, only when the current allowance is short, and the script waits for that receipt before it signs the swap.

  • After broadcasting it registers the hash with the API (POST /status/register, sending both the quoteId and the signed tracking token from the execute response) and polls GET /status/{txHash} every 15 s for up to 10 minutes, printing each transition until complete / failed / untracked. A failed swap exits non-zero.

  • The private key never touches the MCP server. It is read by the example only, and the server is spawned with PRIVATE_KEY stripped from its environment. The server still has no signing code path — viem is a devDependency used by this example alone, never by src/.

License

Apache-2.0

Available Tools

9 tools
build_swap_txBuild an unsigned swap transactionA
Read-only

Turn a quoteId from get_quote into transaction data for the swap. Returns an UNSIGNED transaction: this server never holds keys, never signs and never broadcasts. The calling agent (or the user's wallet) signs and submits it. Quotes expire, so build shortly after quoting.

ParametersJSON Schema
NameRequiredDescriptionDefault
quoteIdYesquoteId from a get_quote result
userAddressYesSender address the transaction is built for

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true; the description reinforces this by explicitly stating the server never holds keys, signs, or broadcasts. Adds the quote-expiry behavior and designates the caller as the signer. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four clear sentences, each adding distinct information: purpose, unsigned/safety model, signer responsibility, and timing. No redundant or filler wording; important constraints are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter tool with annotations, the description covers the output type (unsigned transaction), the security boundary (no signing/broadcasting), the prerequisite (quoteId), and the freshness requirement. Although no output schema exists, the description discloses the essential return information, making it complete enough for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already describes both quoteId and userAddress with 100% coverage. The description adds a small clarification that quoteId originates from get_quote, but this largely mirrors the schema. Baseline 3 applies because the schema carries the parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Turn a quoteId... into transaction data') and identifies the resource (swap transaction). Clearly distinguishes from sibling tools like get_quote by referencing it as the input source and by specifying the unsigned-transaction output.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear context: use after get_quote and before quote expiry. Mentions the prerequisite quoteId and that the transaction is subsequently signed/submitted by the caller. Does not explicitly name sibling alternatives or negative conditions, but the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_cdpBuild an unsigned Indigo close-CDP transactionA

Build a transaction that closes an Indigo CDP: burn the minted iAsset debt and withdraw the ADA collateral. Identify the CDP by the out-ref from get_position (protocol "indigo"). Returns an UNSIGNED transaction as CBOR hex with an empty witness set, plus a human-readable summary. This server never signs, never submits and never holds keys or funds — the agent signs it (CIP-30 signTx) and submits it. Requires BLOCKFROST_PROJECT_ID and INDIGO_SYSTEM_PARAMS_URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
txHashYescdpOutRef.txHash from get_position
addressYesBech32 Cardano address that owns the CDP
outputIndexYescdpOutRef.outputIndex from get_position

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavior beyond annotations: the server never signs, never submits, never holds keys or funds, and returns an unsigned transaction with an empty witness set plus a summary. This clarifies the exact execution boundary and what the agent must do next.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core operation, then covers identification, return value, safety boundary, and prerequisites. Every sentence carries useful information without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description appropriately explains the return payload: CBOR-hex unsigned transaction, empty witness set, and human-readable summary. It also names required environment variables and the CIP-30 signing handoff, making the full call context complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents that txHash and outputIndex come from cdpOutRef in get_position and that address is the Bech32 CDP owner. The description reinforces this provenance but does not add meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: building a transaction that closes an Indigo CDP, with concrete sub-effects (burn iAsset debt, withdraw ADA collateral). This clearly distinguishes it from siblings like open_cdp and build_swap_tx.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly ties the CDP to an out-ref from get_position with protocol "indigo", giving the agent a clear input source and workflow. It does not explicitly say 'use this only when closing an Indigo CDP, not for other operations', but the close-specific wording makes the intended use clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_balanceGet a Cardano address balanceA
Read-only

Read the ADA and native-asset balance of a Cardano address from Blockfrost. Read-only. Requires BLOCKFROST_PROJECT_ID; an address never seen on-chain reports a zero balance.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesBech32 Cardano address (addr1... / addr_test1...)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds two genuinely new behavioral facts: the BLOCKFROST_PROJECT_ID requirement and the fact that unseen addresses return zero balance. This goes beyond annotation coverage and helps the agent anticipate side effects and requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The core action is front-loaded, followed by the read-only nature, the environment requirement, and the notable zero-balance behavior. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with readOnlyHint and openWorldHint already provided, the description covers the essential usage requirements (env var, zero-balance edge case). It does not describe return format or error handling, but with no output schema and a trivial operation, that is a minor gap. It is adequate for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers the single parameter fully with its own description ('Bech32 Cardano address (addr1... / addr_test1...)'). The tool description does not add anything beyond the schema for the parameter, so the baseline of 3 applies. It correctly points to the address parameter but adds no new syntax or format details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and a clear resource ('ADA and native-asset balance of a Cardano address from Blockfrost'). It unambiguously distinguishes this from sibling tools like get_venue, get_quote, or open_cdp, which target different domains. No ambiguity remains about what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it (for reading balances) and provides practical context: it requires BLOCKFROST_PROJECT_ID and explains the zero-balance behavior for unseen addresses. It does not explicitly exclude alternatives, but siblings are so different in purpose that no confusion is likely. It clearly frames this as a read operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_market_dataGet Liqwid market ratesA
Read-only

Read live Liqwid v2 money-market data: supply APY, borrow APR and utilization per market. Read-only, no API key needed. Pass asset to filter to one market by its display name (e.g. "ADA", "iUSD").

ParametersJSON Schema
NameRequiredDescriptionDefault
assetNoFilter to one market by display name, case-insensitive

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint and openWorldHint, so the read-only claim is expected; however, the description adds meaningful context by stating 'no API key needed,' specifying 'live Liqwid v2' data, and naming the exact data fields returned. No behavioral contradictions with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The main purpose is front-loaded, followed by authentication context, then the parameter behavior with examples. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with one optional parameter, the description is complete: it states what data is returned, that it is live, that no API key is needed, and how to filter. The absence of an output schema is mitigated by explicitly listing the returned metrics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and already documents asset as a case-insensitive display-name filter, so the baseline is 3. The description adds value by giving concrete examples ('ADA', 'iUSD') that illustrate valid asset values, which the schema alone does not provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Read live Liqwid v2 money-market data,' then enumerates exactly what is returned (supply APY, borrow APR, utilization per market). This makes it easy to distinguish from sibling tools like get_quote or get_balance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for read-only market data and notes that no API key is needed, but it never explicitly states when to prefer this over alternatives or when not to use it. Usage context is clear, but exclusion/alternative guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_positionGet DeFi positions for an addressA
Read-only

Read open positions for a Cardano address: Indigo CDPs (collateral, minted iAsset debt, frozen flag, and the CDP out-ref that close_cdp needs) or Liqwid loans (debt, collateral value, health factor, LTV). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesBech32 Cardano address that owns the positions
protocolYesWhich protocol to read positions from

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description reinforces this with 'Read-only.' Beyond that, it details what data is returned for each protocol (e.g., collateral, debt, health factor), which gives the agent concrete expectations about the operation's behavior without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no redundant phrasing. It front-loads the core purpose, then provides concise protocol-specific details, all in an efficient and structured manner.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Since there is no output schema, the description appropriately explains the return values for both protocols, including the CDP out-ref that close_cdp needs. It covers everything an agent needs to know to invoke the tool and interpret its result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters (address and protocol) are fully documented in the schema. The description does not add additional meaning to the parameters beyond what the schema already provides, so it earns the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads open positions for a Cardano address, and then enumerates the exact types (Indigo CDPs and Liqwid loans) with their key fields. It also distinguishes itself from siblings like get_balance by focusing on positions, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use the tool (to read positions from specific protocols), and the protocol parameter selects the type. It does not explicitly mention alternatives or exclusions, but the sibling set and the explicit protocol choice make the intended usage evident.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_quoteGet cross-chain swap quotesA
Read-only

Race the BazaarSwap routing backend for cross-chain swap quotes (for example EVM assets into ADA) and return the best route plus every route found, sorted by net output. Read-only: quoting moves no funds. Amounts are in the source token's smallest unit. The returned quoteId feeds build_swap_tx. The race can take up to ~25 seconds.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesAmount to send, in the source token's smallest unit
toChainYesDestination chain id, e.g. "CARDANO" for Cardano
toTokenYesDestination token address; native ADA on "CARDANO" is the zero address
slippageNoSlippage tolerance in percent, e.g. "0.5"
fromChainYesSource chain id, e.g. "1" for Ethereum
fromTokenYesSource token address (or native-token sentinel)
userAddressYesSender address on the source chain
recipientAddressNoDestination-chain recipient; defaults to the sender when omitted

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint. The description adds value beyond that: it explains the racing behavior, the ~25-second latency, that it returns both the best route and all routes sorted by net output, and the relationship to build_swap_tx. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, all carrying weight: purpose, read-only safety, amount units, and quoteId integration / timing. Purpose is front-loaded; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description explains the return shape at a high level (best route + all routes sorted, quoteId) and covers latency and safety. It could detail the route object structure or error cases, but given the strong annotations and 100% schema coverage, only a minor gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage, so the baseline is 3. The description repeats the amount-unit detail already in the schema ('Amounts are in the source token's smallest unit') and adds no new meaning for parameters like slippage, fromChain, or userAddress.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Race the BazaarSwap routing backend for cross-chain swap quotes' and states the exact output (best route plus every route, sorted by net output). It differentiates from build_swap_tx by noting the returned quoteId feeds that tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: read-only, no funds moved, quoteId feeds build_swap_tx, and a ~25s race duration. However, it does not explicitly name alternatives or state when NOT to use this tool, so it stops short of the 'explicit when/when-not/alternatives' bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_venueGet one Cardano DeFi venueA
Read-only

Get the full taxonomy record for one venue by id (e.g. "minswap", "liqwid", "indigo"): category, url, assets, capabilities, integration level and caveats. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesVenue id, e.g. "indigo"

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description repeats the read-only annotation but adds value by detailing what the record contains. It does not cover error cases or rate limits, but given the simple read-only nature and annotation coverage, the provided details are sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The first sentence front-loads the purpose and output contents, the second confirms read-only. Every word serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with no output schema, the description adequately explains what is returned. It lacks explicit error behavior or a pointer to list_venues, but those are minor gaps given the tool's simplicity and the read-only annotation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already describes the id parameter. The description adds multiple concrete examples ("minswap", "liqwid", "indigo") and the phrase "by id" clarifies the expected input context, going slightly beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (Get the full taxonomy record) and differentiates from list_venues by focusing on a single venue by id. It also enumerates the fields included (category, url, assets, capabilities, integration level, caveats), which makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: call this tool when you have a known venue id and need the full record. It does not explicitly mention alternatives like list_venues for discovering ids or when not to use this tool, leaving the usage context to be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_venuesList Cardano DeFi venuesA
Read-only

List the indexed Cardano DeFi venues (DEXes, lending markets, CDP and stablecoin protocols, perps). Optionally filter by category, asset ticker or capability, or pass query for a free-text search over id, name, description and assets. Read-only: returns index data, not live chain state.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetNoAsset ticker the venue must list, e.g. "ADA" or "iUSD"
queryNoFree-text search; when set, the other filters are ignored
categoryNoVenue category filter
capabilityNoCapability the venue must offer, e.g. "borrow"

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already signals safety, and the description adds meaningful context by stating 'Read-only: returns index data, not live chain state.' This clarifies that results are from the index, not a live chain query, which is valuable beyond the annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the core purpose, then filter options, then an important read-only qualifier. No wasted words or redundant repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with 4 optional parameters, full schema coverage, and a readOnlyHint, the description provides enough to invoke it correctly: what it lists, which filters exist, what free-text query searches, and what the data scope is. No output schema exists, but the nature of a venue list makes the return shape largely predictable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description adds value by expanding on the parameter meanings: it lists venue category types, explains what 'asset' refers to, and specifies that 'query' searches id, name, description, and assets. This complements rather than repeats the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List the indexed Cardano DeFi venues' with concrete category examples. This clearly distinguishes list_venues from singular sibling tools like get_venue.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description conveys clear usage context: it is the collection-listing tool with optional filters for category, asset, capability, and free-text query. It does not explicitly name alternatives or exclusions, but the list-oriented framing makes when-to-use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_cdpBuild an unsigned Indigo open-CDP transactionA

Build a transaction that opens an Indigo CDP: lock ADA collateral and mint an iAsset (e.g. iUSD). Returns an UNSIGNED transaction as CBOR hex with an empty witness set, plus a human-readable summary. Pyth-priced markets (e.g. iUSD): the tx embeds a signed price with a ~280-second validity window, so sign and submit promptly after building — a paused/stale tx fails on-chain validation; rebuild instead. This server never signs, never submits and never holds keys or funds — the agent signs it (CIP-30 signTx) and submits it. ADA collateral only; requires BLOCKFROST_PROJECT_ID and INDIGO_SYSTEM_PARAMS_URL.

ParametersJSON Schema
NameRequiredDescriptionDefault
iassetYesiAsset to mint, e.g. "iUSD"
addressYesBech32 Cardano address that will own the CDP and fund it
mintAmountYesiAsset amount to mint, in its smallest unit
collateralLovelaceYesADA collateral to lock, in lovelace (1 ADA = 1000000 lovelace)

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide only readOnlyHint=false, openWorldHint=true, and destructiveHint=false. The description adds substantial behavioral disclosure: the server never signs, never submits, never holds keys or funds, the returned tx is unsigned and must be signed by the agent, and Pyth-priced txs expire and fail on-chain if stale. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, each earning its place: the first states the main purpose and return value, the second covers the critical timing caveat, the third clarifies the security/trust model, and the fourth lists prerequisites. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description fully specifies what the agent receives, what to do next, what can fail, and what environment prerequisites are needed. It covers return format, signing/submission workflow, expiry behavior, collateral type, and required configuration, making the tool safe and actionable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented with units and formats. The description reinforces that ADA collateral is used and gives 'iUSD' as an example iAsset, but it does not meaningfully extend parameter semantics beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('build') and resource ('transaction that opens an Indigo CDP'), with concrete actions ('lock ADA collateral and mint an iAsset') and the precise return type ('UNSIGNED transaction as CBOR hex with an empty witness set, plus a human-readable summary'). This clearly distinguishes it from sibling tools like close_cdp and build_swap_tx.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for use: it is for opening a CDP and the caller must sign and submit the result. It also provides a critical timing guideline with the ~280-second price-validity window and instructs to rebuild if the tx goes stale. It does not explicitly name sibling alternatives, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.0
    • First observedbuild_swap_tx
    • First observedclose_cdp
    • First observedget_balance
    • First observedget_market_data
    • First observedget_position
    • First observedget_quote
    • First observedget_venue
    • First observedlist_venues
    • First observedopen_cdp

TDQS

A4.3/5.0

Scored across 9 tools

Disambiguation4/5

Tools are mostly distinct, but get_quote and build_swap_tx are tightly coupled (quote must precede build), and get_balance/get_position both read address state but for different purposes. Minor potential confusion between get_position and get_balance for an agent, but descriptions clarify domains.

Naming Consistency4/5

All verbs are in present tense (get, list, build, open, close) and nouns are clear (venue, quote, swap_tx, balance, position, market_data, cdp). The pattern is consistent, with minor deviation like 'list_venues' vs 'get_*' but still predictable. Overall coherent.

Tool Count5/5

9 tools is well-scoped for a Cardano DeFi server covering venue discovery, quoting/swap, balance/position reads, market data, and CDP lifecycle. Each tool has a clear purpose and no redundancy.

Completeness4/5

The surface covers venue discovery, read-only balances/positions, market data, swap quoting/building, and CDP open/close. Missing operations like updating or adjusting a CDP (adding collateral, minting more iAsset) and Liqwid loan lifecycle (borrow, repay) are notable gaps, but the core DeFi workflows are present.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers