MCP 服务器

yieldhunter

io.github.agentsherpa/yieldhunter
加密货币与 Web3 金融与投资 公开且可连接 MCP 2025-11-25

此 MCP 可以做什么

Ranks and explains risk-adjusted stablecoin yield opportunities on Ethereum, Base, and Arbitrum without holding funds or executing transactions.

compare_opportunities
Compare opportunities
Side-by-side comparison of 2–5 opportunities by risk-adjusted score. Pass list_yields opportunities[].id values as poolIds or opportunityIds. Returns ranked list, compact comparison table fields, winnerId, and rationale bullets (including when raw APY leader differs from risk-adjusted winner). sourceChainKey is ethereum|base|arbitrum only (unknown → VALIDATION_ERROR; no invented bridge fee). Research only — non-custodial. Example: { "poolIds": ["pool-id-a", "pool-id-b", "pool-id-c"], "horizonDays": 30 }
只读 可访问外部资源 幂等
输入模式
{'type': 'object', 'anyOf': [{'required': ['poolIds']}, {'required': ['opportunityIds']}], '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'poolIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 5, 'minItems': 2, 'description': '2–5 list_yields opportunities[].id values. Example: ["id-a","id-b"]. Alias: opportunityIds.'}, 'horizonDays': {'type': 'number', 'maximum': 365, 'description': 'Holding horizon in days for gas/bridge amortization (default 30). Example: 30', 'exclusiveMinimum': 0}, 'notionalUsd': {'type': 'number', 'description': 'Notional USD size for net-yield cost amortization and exitRisk TVL multiples (default 10000). Example: 10000', 'exclusiveMinimum': 0}, 'opportunityIds': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 5, 'minItems': 2, 'description': 'Alias for poolIds — same list_yields opportunities[].id values.'}, 'sourceChainKey': {'type': 'string', 'description': "Agent's current chain for bridge cost estimate: ethereum | base | arbitrum (aliases: eth, ETH, Ethereum, arb, ARB, BASE). Blank/whitespace is VALIDATION_ERROR (omit the field to default). Unknown keys (solana, foo) return VALIDATION_ERROR — no invented bridge fee."}}, 'additionalProperties': False}
explain_score
Explain score
Agent-readable explanation of why an opportunity received its risk-adjusted score. Chain: pass list_yields opportunities[].id as poolId, opportunityId, or id (aliases for the same key). Returns a summary paragraph, factor bullets with weighted contributions, net-yield notes, and an exitRisk heuristic line (liquidity-only — not on-chain withdraw or transfer/eligibility; medium often confidence-driven, not pool size; extra bullet when knownIssues note transfer restrictions). sourceChainKey is ethereum|base|arbitrum only (unknown → VALIDATION_ERROR; no invented bridge fee). Prefer this when you need to justify a ranking to a human or another agent. Research only — non-custodial. Example: { "opportunityId": "43641cf5-a92e-416b-bce9-27113d3c0db6", "horizonDays": 30 } Also accepts poolId or id with the same value.
只读 可访问外部资源 幂等
输入模式
{'type': 'object', 'anyOf': [{'required': ['id']}, {'required': ['opportunityId']}, {'required': ['poolId']}], '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'Same as list_yields opportunities[].id (canonical response field name).'}, 'poolId': {'type': 'string', 'minLength': 1, 'description': 'Alias for list_yields opportunities[].id (historical tool field). Same DefiLlama pool UUID. Example: "43641cf5-a92e-416b-bce9-27113d3c0db6"'}, 'horizonDays': {'type': 'number', 'maximum': 365, 'description': 'Holding horizon in days for gas/bridge amortization (default 30). Example: 30', 'exclusiveMinimum': 0}, 'notionalUsd': {'type': 'number', 'description': 'Notional USD size for net-yield cost amortization and exitRisk TVL multiples (default 10000). Example: 10000', 'exclusiveMinimum': 0}, 'opportunityId': {'type': 'string', 'minLength': 1, 'description': 'Alias for list_yields opportunities[].id (same pool key as poolId / id).'}, 'sourceChainKey': {'type': 'string', 'description': "Agent's current chain for bridge cost estimate: ethereum | base | arbitrum (aliases: eth, ETH, Ethereum, arb, ARB, BASE). Blank/whitespace is VALIDATION_ERROR (omit the field to default). Unknown keys (solana, foo) return VALIDATION_ERROR — no invented bridge fee."}}, 'additionalProperties': False}
get_protocol_risk
Get protocol risk
Protocol-level risk card (age, audit signals, curated known issues, category, score 0–100). Chain: pass list_yields opportunities[].protocolSlug as protocol or protocolSlug. Higher score = lower protocol risk. Uses curated priors plus DefiLlama metadata when available. Research only — non-custodial. Example: { "protocol": "aave-v3" } Also accepts protocolSlug.
只读 可访问外部资源 幂等
输入模式
{'type': 'object', 'anyOf': [{'required': ['protocol']}, {'required': ['protocolSlug']}], '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'protocol': {'type': 'string', 'minLength': 1, 'description': 'Protocol slug (DefiLlama project id), e.g. "aave-v3". Same as list_yields opportunities[].protocolSlug.'}, 'protocolSlug': {'type': 'string', 'minLength': 1, 'description': 'Alias for protocol — list_yields opportunities[].protocolSlug.'}}, 'additionalProperties': False}
health
Health
Liveness and capability check for yieldhunter (yieldhunter.eth). Returns service status, schemaVersion, scoringVersion, feature flags, and the list of available tools. Use this first to verify connectivity. If yields+pegs vintage is missing or at/over YH_STALE_DEGRADE_SECONDS (default 2h), health may refresh DefiLlama market caches once (same adapters as list_yields; not a list_yields tool call). Kill switch on: health still answers, refresh skipped. Research estimates only — non-custodial; never holds keys or executes transactions. Copy-paste path starts here, then list_yields. Example input: {}
只读 幂等
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}, 'additionalProperties': False}
list_yields
List risk-adjusted yields
Rank stablecoin yield opportunities on Ethereum, Base, and Arbitrum using multi-factor **risk-adjusted** scoring (not raw APY). chains/chainIds: those three only (aliases eth/ETH/Ethereum, arb/ARB, BASE) — any unsupported or blank value (solana, optimism, "") is VALIDATION_ERROR, not a silent default-universe fallback. sourceChainKey: same keys/aliases; blank or unknown keys are VALIDATION_ERROR (bridge cost is not estimated). Default ranking is risk-adjusted score, not highest APY. For headline yield order, use sortBy=net_apy. Default is risk-adjusted ranking with balanced weights. Optional params are policy controls for visiting agents. Default when omitted: sortBy=risk_adjusted, sortOrder=desc, riskAppetite=balanced (v1.1 weights), no minScore, no category filter, diversity=soft (max 2 markets per protocol in presented top-k). Primary composite key: compositeRiskAdjusted (protocol risk, depeg/counterparty, liquidity, yield quality base vs incentive, net yield after gas/bridge). Opportunities may include stability signals: apyChange24h is pool-level DefiLlama apyPct1D when present as a number (including 0 = observed flat change); null/missing means unknown/not provided for that pool (e.g. some Pendle markets) — not the same as 0, never invent 0; tvlChange24hPct is protocol-level DefiLlama change_1d (shared across markets of the same protocol — not this pool's TVL flow; missing stays null); large APY jumps warn only. Also exitRisk/exitRiskReason (size-vs-pool liquidity heuristic only: pool TVL vs notionalUsd + liquidity confidence — not on-chain withdraw, not queue/cap/pause/lockup, not transfer whitelist/eligibility/redemption, not an execution gate; unknown ≠ safe; medium often means liquidity confidence medium, not “small pool”; low is strict; when knownIssues mention transfer/eligibility do not treat low as free exit; soft warnings on high/unknown, plus low/medium if those issues are present; does not change default risk-adjusted ranking). Optional policy knobs: sortBy (risk_adjusted|net_apy|gross_apy|tvl), sortOrder, riskAppetite (conservative|balanced|aggressive), minScore (0–100 after appetite; practical bands ~≥85 treasury default, ≥80 selective; 90 is rare/very strict — a few top L2 blue-chips may clear it), categories / excludeCategories (lending|rwa|other), diversity (soft|off — default top prefers protocol diversity; set off for every market from one protocol), includeFactors (boolean, default false — when true each opportunity has scores.factors compact map without a second tool call), maxRewardShare (0–1 optional incentive-share gate only — max reward/total; e.g. 0.3 treasury, 0.25 stricter; unknown share excluded when set; does not remove high base-only APY farms — pair with minScore/riskAppetite/excludeCategories for capital preservation). Prefer this when capital preservation and sustainable yield matter more than headline APY. Research only — never executes transactions or holds keys. Copy-paste path (after health {}): { "assets": ["USDC"], "sortBy": "risk_adjusted" } Then contrast #1 vs #2 (risk-adjusted winner vs next row — often higher rate / thinner liquidity / other chain). Do not contrast against the max-APY row in the ten. Examples: (a) Treasury/conservative: { "riskAppetite": "conservative", "minScore": 85, "excludeCategories": ["rwa"], "maxRewardShare": 0.3, "minTvlUsd": 10000000, "limit": 10 } (b) Default research (v1.1): { "assets": ["USDC"], "sortBy": "risk_adjusted" } (c) Yield-seeking: { "sortBy": "net_apy", "riskAppetite": "aggressive", "chains": ["base"], "assets": ["USDC"], "limit": 15 } (d) With factor breakdown: { "assets": ["USDC"], "limit": 5, "includeFactors": true }
只读 可访问外部资源 幂等
输入模式
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 25, 'description': 'Max results to return (default 10, max 25). Example: 10', 'exclusiveMinimum': 0}, 'assets': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Stablecoin symbols to match in pool symbol, e.g. ["USDC","USDT"]'}, 'chains': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter chains: ethereum | base | arbitrum (aliases eth/ETH/Ethereum, arb/ARB, BASE; or Llama names). Default when field omitted: all three. Blank, whitespace, or unsupported values (solana, optimism, "") are VALIDATION_ERROR — not a silent fallback. Example: ["base","ethereum"]'}, 'sortBy': {'enum': ['risk_adjusted', 'net_apy', 'gross_apy', 'tvl'], 'type': 'string', 'description': 'Sort key: "risk_adjusted" (default) | "net_apy" | "gross_apy" | "tvl"'}, 'chainIds': {'type': 'array', 'items': {'type': 'integer'}, 'description': 'Optional numeric chain ids: 1, 8453, 42161 only. Any other id is VALIDATION_ERROR (not a silent default-universe fallback).'}, 'minScore': {'anyOf': [{'type': 'number', 'maximum': 100, 'minimum': 0}, {'type': 'null'}], 'description': 'Minimum compositeRiskAdjusted after appetite weights (0–100). Omitted = no filter'}, 'diversity': {'enum': ['soft', 'off'], 'type': 'string', 'description': 'Presented top-k protocol diversity: "soft" (default, max 2 per protocol) | "off" (plain score order, every market)'}, 'minTvlUsd': {'type': 'number', 'minimum': 0, 'description': 'Minimum TVL in USD (default 1000000). Example: 5000000'}, 'protocols': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional protocol slugs, e.g. ["aave-v3","morpho-blue"]. Blank entries are VALIDATION_ERROR (not treated as all protocols).'}, 'sortOrder': {'enum': ['asc', 'desc'], 'type': 'string', 'description': 'Sort direction: "desc" (default) | "asc"'}, 'categories': {'type': 'array', 'items': {'enum': ['lending', 'rwa', 'other'], 'type': 'string'}, 'description': 'Include only these categories: "lending" | "rwa" | "other"'}, 'horizonDays': {'type': 'number', 'maximum': 365, 'description': 'Holding horizon in days for gas/bridge amortization (default 30). Example: 30', 'exclusiveMinimum': 0}, 'notionalUsd': {'type': 'number', 'description': 'Notional USD size for net-yield cost amortization and exitRisk TVL multiples (default 10000). Example: 10000', 'exclusiveMinimum': 0}, 'riskAppetite': {'enum': ['conservative', 'balanced', 'aggressive'], 'type': 'string', 'description': 'Scoring weight profile: "balanced" (default/v1.1) | "conservative" | "aggressive"'}, 'includeFactors': {'type': 'boolean', 'description': 'If true, each opportunity includes scores.factors compact map (protocolRisk, depegCounterparty, liquidity, yieldQuality, costAdjusted). Default false — omits heavy factors[] rationales.'}, 'maxRewardShare': {'anyOf': [{'type': 'number', 'maximum': 1, 'minimum': 0}, {'type': 'null'}], 'description': 'Incentive-share gate only: max reward/total of gross APY, 0–1 (e.g. 0.3 treasury, 0.25 stricter). Does not remove high base-only APY farms. Capital preservation still needs minScore/riskAppetite/excludeCategories. Omitted = no filter. Unknown share excluded when set.'}, 'sourceChainKey': {'type': 'string', 'description': "Agent's current chain for bridge cost estimate: ethereum | base | arbitrum (aliases: eth, ETH, Ethereum, arb, ARB, BASE). Blank/whitespace is VALIDATION_ERROR (omit the field to default). Unknown keys (solana, foo) return VALIDATION_ERROR — no invented bridge fee."}, 'excludeCategories': {'type': 'array', 'items': {'$ref': '#/properties/categories/items'}, 'description': 'Exclude these categories, e.g. ["rwa"]'}}, 'additionalProperties': False}
score_opportunity
Score opportunity
Compute the full multi-factor risk-adjusted score for a single opportunity from list_yields. Chain: pass list_yields opportunities[].id as poolId, opportunityId, or id (same DefiLlama pool UUID; id is the canonical list field). Returns APY breakdown (base/reward/total), factor scores with rationales, net yield after gas/bridge, exitRisk heuristic (TVL vs notional + liq conf only; medium ≠ small pool; not queues/caps/transfer whitelist/eligibility/on-chain withdraw; do not treat low as free exit when knownIssues mention transfer/eligibility), warnings, and sources. sourceChainKey is ethereum|base|arbitrum only — unknown keys (foo, solana) are VALIDATION_ERROR; no invented bridge fee. Research estimates only — non-custodial. Example (any one id field): { "id": "43641cf5-a92e-416b-bce9-27113d3c0db6", "horizonDays": 30, "notionalUsd": 10000 } Also accepts poolId or opportunityId with the same value.
只读 可访问外部资源 幂等
输入模式
{'type': 'object', 'anyOf': [{'required': ['id']}, {'required': ['opportunityId']}, {'required': ['poolId']}], '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'id': {'type': 'string', 'minLength': 1, 'description': 'Same as list_yields opportunities[].id (canonical response field name).'}, 'poolId': {'type': 'string', 'minLength': 1, 'description': 'Alias for list_yields opportunities[].id (historical tool field). Same DefiLlama pool UUID. Example: "43641cf5-a92e-416b-bce9-27113d3c0db6"'}, 'horizonDays': {'type': 'number', 'maximum': 365, 'description': 'Holding horizon in days for gas/bridge amortization (default 30). Example: 30', 'exclusiveMinimum': 0}, 'notionalUsd': {'type': 'number', 'description': 'Notional USD size for net-yield cost amortization and exitRisk TVL multiples (default 10000). Example: 10000', 'exclusiveMinimum': 0}, 'opportunityId': {'type': 'string', 'minLength': 1, 'description': 'Alias for list_yields opportunities[].id (same pool key as poolId / id).'}, 'sourceChainKey': {'type': 'string', 'description': "Agent's current chain for bridge cost estimate: ethereum | base | arbitrum (aliases: eth, ETH, Ethereum, arb, ARB, BASE). Blank/whitespace is VALIDATION_ERROR (omit the field to default). Unknown keys (solana, foo) return VALIDATION_ERROR — no invented bridge fee."}}, 'additionalProperties': False}
已添加
get_protocol_risk
2026年9月17日 12:40
已添加
explain_score
2026年9月17日 12:40
已添加
compare_opportunities
2026年9月17日 12:40
已添加
score_opportunity
2026年9月17日 12:40
已添加
list_yields
2026年9月17日 12:40
已添加
health
2026年9月17日 12:40