Skip to content
Back to Teardrop

Card snapshot

api.teardrop.dev · 2026-09-11 12:57:40 UTC · cab6c1d2abe6f6fe1e09de3c3b8fb2831d604ecc626b21940d41e414560bcdc3

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "schema_version": "1.0",
  "protocolVersion": "1.0",
  "name": "Teardrop",
  "description": "A2A-delegable Web3 decision service for counterparty-risk and DeFi yield-opportunity verdicts, with evidence-backed outcomes and metered USDC access.",
  "version": "1.6.0",
  "url": "https://api.teardrop.dev",
  "provider": {
    "organization": "Teardrop AI",
    "url": "https://api.teardrop.dev"
  },
  "documentationUrl": "https://api.teardrop.dev/docs",
  "supportedInterfaces": [
    {
      "url": "https://api.teardrop.dev/agent/run",
      "protocolBinding": "https://teardrop.ai/bindings/ag-ui-sse/v1",
      "protocolVersion": "1.0"
    },
    {
      "url": "https://api.teardrop.dev/message:send",
      "protocolBinding": "https://teardrop.ai/bindings/a2a-jsonrpc/v1",
      "protocolVersion": "1.0"
    }
  ],
  "capabilities": {
    "streaming": true,
    "pushNotifications": false,
    "extendedAgentCard": false,
    "a2ui": true,
    "mcp_tools": true,
    "multi_turn": true,
    "human_in_the_loop": true,
    "billing": {
      "enabled": true,
      "scheme": "exact",
      "network": "eip155:8453",
      "payment_endpoint": "/agent/run",
      "pricing_endpoint": "/billing/pricing"
    },
    "onboarding": {
      "enabled": true,
      "methods": [
        "siwe",
        "x402"
      ],
      "token_endpoint": "/token",
      "nonce_endpoint": "/auth/siwe/nonce",
      "topup_requirements_endpoint": "/billing/topup/usdc/requirements",
      "topup_endpoint": "/billing/topup/usdc",
      "credential_recovery": "siwe + POST /org/credentials/regenerate",
      "x402_grant_type": "x402"
    },
    "asyncTasks": {
      "enabled": true,
      "request_header": "Prefer: respond-async",
      "status_endpoint": "/message:status/{task_id}",
      "max_concurrency": 8,
      "queue_size": 100
    },
    "marketplace": {
      "enabled": true,
      "catalog_endpoint": "/marketplace/catalog",
      "authors_endpoint": "/marketplace/authors",
      "agents_endpoint": "/marketplace/agents",
      "agent_directory_endpoint": "/marketplace/agents",
      "quote_endpoint": "/marketplace/quote?tool={qualified_name}",
      "author_catalog_endpoint": "/marketplace/catalog?org_slug={org_slug}",
      "self_inventory_endpoint": "/agent/tools",
      "agent_registration_endpoint": "/marketplace/agent-registration",
      "registration_benefits_endpoint": "/.well-known/registry-benefits.json",
      "mcp_gateway_endpoint": "/tools/mcp",
      "registration": {
        "author_config_endpoint": "/marketplace/author-config",
        "tool_registration_endpoint": "/tools",
        "auth": "siwe_or_admin",
        "wallet_binding": "siwe_self"
      }
    },
    "eventTriggers": {
      "enabled": true,
      "registration_endpoint": "/agent/event-triggers",
      "dispatch_endpoint_template": "/agent/events/{trigger_token}",
      "task_endpoint_template": "/agent/event-triggers/{schedule_id}/runs/{run_id}",
      "registration_auth": "bearer_jwt",
      "dispatch_auth": "X-Teardrop-Trigger-Secret",
      "max_event_bytes": 65536,
      "max_per_org": 20,
      "max_concurrency": 8,
      "max_concurrency_per_org": 4
    }
  },
  "protocols": [
    "ag-ui",
    "a2a",
    "mcp"
  ],
  "endpoints": {
    "agent_run": "/agent/run",
    "health": "/health",
    "docs": "/docs",
    "mcp_tools": "/tools/mcp",
    "a2a_message": "/message:send",
    "a2a_message_status": "/message:status/{task_id}",
    "marketplace_catalog": "/marketplace/catalog",
    "marketplace_authors": "/marketplace/authors",
    "marketplace_quote": "/marketplace/quote",
    "event_trigger_registration": "/agent/event-triggers",
    "event_trigger_dispatch": "/agent/events/{trigger_token}",
    "event_trigger_task": "/agent/event-triggers/{schedule_id}/runs/{run_id}"
  },
  "defaultInputModes": [
    "text/plain",
    "application/json"
  ],
  "defaultOutputModes": [
    "text/plain",
    "application/json"
  ],
  "skills": [
    {
      "id": "task_planning",
      "name": "task_planning",
      "description": "Break complex tasks into actionable steps."
    },
    {
      "id": "assess_counterparty_risk",
      "name": "assess_counterparty_risk",
      "description": "Return a decision-ready counterparty-risk verdict for an EVM address before funds or authority are committed. The result branches to high_risk, caution, acceptable, or insufficient_data with the evidence needed for the calling agent to act.",
      "tags": [
        "risk",
        "counterparty",
        "security",
        "approvals",
        "liquidation",
        "web3"
      ],
      "version": "1.0.0",
      "use_when": "Delegate this check before sending funds, granting approvals, or interacting with an unknown EVM address when the caller needs a bounded risk decision.",
      "limitations": "Analytics and heuristic risk assessment; not a credit bureau, fraud guarantee, or legal endorsement. Relies on DeBank indexing and on-chain Aave/Compound contract states.",
      "alternatives": [
        "get_wallet_approvals",
        "get_liquidation_risk",
        "get_wallet_positions"
      ],
      "reputation": {
        "reputation_score": 0.0,
        "success_rate": 0.0,
        "sample_size": 0.0,
        "confidence": 0.0,
        "freshness": 0.0,
        "average_latency_ms": 0.0
      }
    },
    {
      "id": "delegate_to_agent",
      "name": "delegate_to_agent",
      "description": "Delegate a task to a remote A2A-compliant agent. Discovers the agent's capabilities via its agent card, sends it a message, and returns the result. Use when a task requires specialist capabilities beyond your own tools.",
      "tags": [
        "a2a",
        "delegation",
        "agent"
      ],
      "version": "1.0.0"
    },
    {
      "id": "discover_agents",
      "name": "discover_agents",
      "description": "Find opt-in remote A2A agents, published tool capabilities, endpoints, and public reputation status.",
      "tags": [
        "a2a",
        "agents",
        "marketplace",
        "discovery"
      ],
      "version": "1.0.0",
      "use_when": "Use before delegate_to_agent when a specialist agent is needed but its URL is unknown.",
      "limitations": "Discovery is read-only and does not add an agent to the org allowlist; delegate_to_agent remains authoritative.",
      "alternatives": [
        "delegate_to_agent"
      ],
      "reputation": {
        "reputation_score": 0.0,
        "success_rate": 0.0,
        "sample_size": 0.0,
        "confidence": 0.0,
        "freshness": 0.0,
        "average_latency_ms": 0.0
      }
    },
    {
      "id": "validate_opportunity",
      "name": "validate_opportunity",
      "description": "Return a decision-ready yield-opportunity verdict before capital is deployed. The result branches to sustainable, caution, unsustainable, or insufficient_data and gives the calling agent the evidence needed to proceed, pause, or reject the opportunity.",
      "tags": [
        "defi",
        "yield",
        "risk",
        "validation",
        "opportunity",
        "liquidity"
      ],
      "version": "1.0.0",
      "use_when": "Delegate this check before deploying capital into a DeFi yield pool or staking opportunity when the caller needs an independent sustainability and liquidity decision.",
      "limitations": "Heuristic economic assessment based on DeFiLlama analytics and CoinGecko pricing. Does not audit smart contract bytecode, protocol governance, or admin key security.",
      "alternatives": [
        "get_yield_rates",
        "get_protocol_tvl",
        "get_lending_rates",
        "assess_counterparty_risk"
      ],
      "reputation": {
        "reputation_score": 0.0,
        "success_rate": 0.0,
        "sample_size": 0.0,
        "confidence": 0.0,
        "freshness": 0.0,
        "average_latency_ms": 0.0
      }
    },
    {
      "id": "a2ui_rendering",
      "name": "a2ui_rendering",
      "description": "Declarative UI component generation (table, form, text, button, etc.)."
    },
    {
      "id": "event_trigger_ingress",
      "name": "event_trigger_ingress",
      "description": "Register an authenticated event subscription that starts a bounded agent task and returns an A2A task ID for polling.",
      "tags": [
        "events",
        "webhooks",
        "automation",
        "scheduling"
      ],
      "examples": [
        "Start a task when a deployment fails.",
        "Run this workflow when a marketplace payment settles.",
        "Notify me when a monitored price changes."
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    }
  ],
  "tools": [
    {
      "name": "assess_counterparty_risk",
      "version": "1.0.0",
      "description": "Return a decision-ready counterparty-risk verdict for an EVM address before funds or authority are committed. The result branches to high_risk, caution, acceptable, or insufficient_data with the evidence needed for the calling agent to act.",
      "tags": [
        "risk",
        "counterparty",
        "security",
        "approvals",
        "liquidation",
        "web3"
      ],
      "input_schema": {
        "properties": {
          "wallet_address": {
            "description": "EVM wallet address (0x-prefixed)",
            "title": "Wallet Address",
            "type": "string"
          },
          "chain_ids": {
            "description": "DeBank chain identifiers scoping approvals and history; positions and net worth remain all-chain.",
            "items": {
              "type": "string"
            },
            "title": "Chain Ids",
            "type": "array"
          }
        },
        "required": [
          "wallet_address"
        ],
        "title": "AssessCounterpartyRiskInput",
        "type": "object"
      },
      "use_when": "Delegate this check before sending funds, granting approvals, or interacting with an unknown EVM address when the caller needs a bounded risk decision.",
      "limitations": "Analytics and heuristic risk assessment; not a credit bureau, fraud guarantee, or legal endorsement. Relies on DeBank indexing and on-chain Aave/Compound contract states.",
      "alternatives": [
        "get_wallet_approvals",
        "get_liquidation_risk",
        "get_wallet_positions"
      ],
      "output_schema": {
        "$defs": {
          "ActivitySummary": {
            "properties": {
              "tx_count": {
                "default": 0,
                "title": "Tx Count",
                "type": "integer"
              },
              "distinct_counterparties": {
                "default": 0,
                "title": "Distinct Counterparties",
                "type": "integer"
              },
              "cex_names": {
                "items": {
                  "type": "string"
                },
                "title": "Cex Names",
                "type": "array"
              }
            },
            "title": "ActivitySummary",
            "type": "object"
          },
          "ApprovalSummary": {
            "properties": {
              "total": {
                "default": 0,
                "title": "Total",
                "type": "integer"
              },
              "unlimited": {
                "default": 0,
                "title": "Unlimited",
                "type": "integer"
              },
              "sum_exposure_usd": {
                "default": 0.0,
                "title": "Sum Exposure Usd",
                "type": "number"
              },
              "hacked_spenders": {
                "default": 0,
                "title": "Hacked Spenders",
                "type": "integer"
              },
              "abandoned_spenders": {
                "default": 0,
                "title": "Abandoned Spenders",
                "type": "integer"
              },
              "unverified_spenders": {
                "default": 0,
                "title": "Unverified Spenders",
                "type": "integer"
              }
            },
            "title": "ApprovalSummary",
            "type": "object"
          },
          "DataProvenance": {
            "description": "Machine-readable source and freshness metadata for a tool response.",
            "properties": {
              "provider": {
                "title": "Provider",
                "type": "string"
              },
              "source_urls": {
                "items": {
                  "type": "string"
                },
                "title": "Source Urls",
                "type": "array"
              },
              "retrieved_at": {
                "title": "Retrieved At",
                "type": "string"
              },
              "source_fetched_at": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Source Fetched At"
              },
              "cache_hit": {
                "default": false,
                "title": "Cache Hit",
                "type": "boolean"
              },
              "cache_age_seconds": {
                "anyOf": [
                  {
                    "minimum": 0,
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Cache Age Seconds"
              },
              "cache_ttl_seconds": {
                "anyOf": [
                  {
                    "minimum": 0,
                    "type": "integer"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Cache Ttl Seconds"
              }
            },
            "required": [
              "provider",
              "retrieved_at"
            ],
            "title": "DataProvenance",
            "type": "object"
          },
          "LiquidationSummary": {
            "properties": {
              "status": {
                "default": "no_debt",
                "title": "Status",
                "type": "string"
              },
              "worst_health_factor": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Worst Health Factor"
              },
              "has_borrow_positions": {
                "default": false,
                "title": "Has Borrow Positions",
                "type": "boolean"
              }
            },
            "title": "LiquidationSummary",
            "type": "object"
          },
          "RiskFactor": {
            "properties": {
              "category": {
                "title": "Category",
                "type": "string"
              },
              "severity": {
                "enum": [
                  "high",
                  "medium",
                  "low"
                ],
                "title": "Severity",
                "type": "string"
              },
              "detail": {
                "title": "Detail",
                "type": "string"
              }
            },
            "required": [
              "category",
              "severity",
              "detail"
            ],
            "title": "RiskFactor",
            "type": "object"
          }
        },
        "properties": {
          "wallet_address": {
            "title": "Wallet Address",
            "type": "string"
          },
          "verdict": {
            "enum": [
              "high_risk",
              "caution",
              "acceptable",
              "insufficient_data"
            ],
            "title": "Verdict",
            "type": "string"
          },
          "risk_factors": {
            "items": {
              "$ref": "#/$defs/RiskFactor"
            },
            "title": "Risk Factors",
            "type": "array"
          },
          "approval_summary": {
            "$ref": "#/$defs/ApprovalSummary"
          },
          "liquidation": {
            "$ref": "#/$defs/LiquidationSummary"
          },
          "activity": {
            "$ref": "#/$defs/ActivitySummary"
          },
          "total_net_worth_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "title": "Total Net Worth Usd"
          },
          "partial_errors": {
            "items": {
              "type": "string"
            },
            "title": "Partial Errors",
            "type": "array"
          },
          "data_complete": {
            "default": true,
            "title": "Data Complete",
            "type": "boolean"
          },
          "provenance": {
            "$ref": "#/$defs/DataProvenance"
          },
          "as_of": {
            "title": "As Of",
            "type": "string"
          }
        },
        "required": [
          "wallet_address",
          "verdict",
          "provenance",
          "as_of"
        ],
        "title": "AssessCounterpartyRiskOutput",
        "type": "object"
      },
      "reputation": {
        "reputation_score": 0.0,
        "success_rate": 0.0,
        "sample_size": 0.0,
        "confidence": 0.0,
        "freshness": 0.0,
        "average_latency_ms": 0.0
      }
    },
    {
      "name": "delegate_to_agent",
      "version": "1.0.0",
      "description": "Delegate a task to a remote A2A-compliant agent. Discovers the agent's capabilities via its agent card, sends it a message, and returns the result. Use when a task requires specialist capabilities beyond your own tools.",
      "tags": [
        "a2a",
        "delegation",
        "agent"
      ],
      "input_schema": {
        "properties": {
          "agent_url": {
            "description": "Base URL of the remote A2A agent (e.g. https://agent.example.com)",
            "maxLength": 2000,
            "minLength": 10,
            "title": "Agent Url",
            "type": "string"
          },
          "task_description": {
            "description": "Natural language description of the task to delegate",
            "maxLength": 4096,
            "minLength": 1,
            "title": "Task Description",
            "type": "string"
          },
          "task_type": {
            "default": "general",
            "description": "Broad task class for routing telemetry; never include user data or task text.",
            "enum": [
              "general",
              "research",
              "analysis",
              "data_retrieval",
              "coding",
              "transaction",
              "automation"
            ],
            "title": "Task Type",
            "type": "string"
          }
        },
        "required": [
          "agent_url",
          "task_description"
        ],
        "title": "DelegateToAgentInput",
        "type": "object"
      },
      "output_schema": {
        "properties": {
          "agent_name": {
            "description": "Name of the remote agent (from its agent card)",
            "title": "Agent Name",
            "type": "string"
          },
          "status": {
            "description": "A2A task state: completed, failed, etc.",
            "title": "Status",
            "type": "string"
          },
          "result": {
            "description": "Text result extracted from the remote agent's response",
            "title": "Result",
            "type": "string"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Error message, if any",
            "title": "Error"
          },
          "error_type": {
            "anyOf": [
              {
                "const": "advertised_price_exceeds_cap",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Stable error type for delegation failures that require planner recovery.",
            "title": "Error Type"
          },
          "cost_usdc": {
            "default": 0,
            "description": "Cost of this delegation in atomic USDC",
            "title": "Cost Usdc",
            "type": "integer"
          }
        },
        "required": [
          "agent_name",
          "status",
          "result"
        ],
        "title": "DelegateToAgentOutput",
        "type": "object"
      }
    },
    {
      "name": "discover_agents",
      "version": "1.0.0",
      "description": "Find opt-in remote A2A agents, published tool capabilities, endpoints, and public reputation status.",
      "tags": [
        "a2a",
        "agents",
        "marketplace",
        "discovery"
      ],
      "input_schema": {
        "properties": {
          "q": {
            "anyOf": [
              {
                "maxLength": 200,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Optional search across agent name, organization slug, or published tool name",
            "title": "Q"
          },
          "limit": {
            "default": 20,
            "description": "Maximum number of agents to return",
            "maximum": 50,
            "minimum": 1,
            "title": "Limit",
            "type": "integer"
          }
        },
        "title": "DiscoverAgentsInput",
        "type": "object"
      },
      "use_when": "Use before delegate_to_agent when a specialist agent is needed but its URL is unknown.",
      "limitations": "Discovery is read-only and does not add an agent to the org allowlist; delegate_to_agent remains authoritative.",
      "alternatives": [
        "delegate_to_agent"
      ],
      "output_schema": {
        "$defs": {
          "AgentReputation": {
            "properties": {
              "status": {
                "enum": [
                  "rated",
                  "unrated"
                ],
                "title": "Status",
                "type": "string"
              },
              "score": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Score"
              },
              "success_rate": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Success Rate"
              },
              "sample_size": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Sample Size"
              },
              "confidence": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Confidence"
              },
              "unique_caller_count": {
                "anyOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Unique Caller Count"
              },
              "last_event_at": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Last Event At"
              },
              "is_stale": {
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Is Stale"
              }
            },
            "required": [
              "status"
            ],
            "title": "AgentReputation",
            "type": "object"
          },
          "DiscoveredAgent": {
            "properties": {
              "org_slug": {
                "title": "Org Slug",
                "type": "string"
              },
              "org_name": {
                "title": "Org Name",
                "type": "string"
              },
              "agent_url": {
                "title": "Agent Url",
                "type": "string"
              },
              "agent_card_url": {
                "title": "Agent Card Url",
                "type": "string"
              },
              "message_endpoint": {
                "title": "Message Endpoint",
                "type": "string"
              },
              "catalog_endpoint": {
                "title": "Catalog Endpoint",
                "type": "string"
              },
              "tool_count": {
                "title": "Tool Count",
                "type": "integer"
              },
              "tool_names": {
                "description": "Names of up to 20 active published tools exposed by the agent organization",
                "items": {
                  "type": "string"
                },
                "title": "Tool Names",
                "type": "array"
              },
              "registered_at": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "description": "UTC timestamp when the organization first registered its A2A endpoint",
                "title": "Registered At"
              },
              "allowlisted": {
                "anyOf": [
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Whether the caller's org has this endpoint in its allowlist; null when caller context is unavailable",
                "title": "Allowlisted"
              },
              "reputation": {
                "$ref": "#/$defs/AgentReputation"
              }
            },
            "required": [
              "org_slug",
              "org_name",
              "agent_url",
              "agent_card_url",
              "message_endpoint",
              "catalog_endpoint",
              "tool_count",
              "allowlisted",
              "reputation"
            ],
            "title": "DiscoveredAgent",
            "type": "object"
          }
        },
        "properties": {
          "generated_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Generated At"
          },
          "count": {
            "title": "Count",
            "type": "integer"
          },
          "agents": {
            "items": {
              "$ref": "#/$defs/DiscoveredAgent"
            },
            "title": "Agents",
            "type": "array"
          },
          "registration_endpoint": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Endpoint where an organization can publish its own A2A endpoint.",
            "title": "Registration Endpoint"
          },
          "registration_benefits_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "default": null,
            "description": "Machine-readable registration benefits, requirements, and non-guarantees.",
            "title": "Registration Benefits Url"
          }
        },
        "required": [
          "generated_at",
          "count",
          "agents"
        ],
        "title": "DiscoverAgentsOutput",
        "type": "object"
      },
      "reputation": {
        "reputation_score": 0.0,
        "success_rate": 0.0,
        "sample_size": 0.0,
        "confidence": 0.0,
        "freshness": 0.0,
        "average_latency_ms": 0.0
      }
    },
    {
      "name": "validate_opportunity",
      "version": "1.0.0",
      "description": "Return a decision-ready yield-opportunity verdict before capital is deployed. The result branches to sustainable, caution, unsustainable, or insufficient_data and gives the calling agent the evidence needed to proceed, pause, or reject the opportunity.",
      "tags": [
        "defi",
        "yield",
        "risk",
        "validation",
        "opportunity",
        "liquidity"
      ],
      "input_schema": {
        "properties": {
          "pool_id": {
            "description": "DeFiLlama yield pool UUID (e.g. '747c1d2a-c668-4682-b9f9-296708a3dd90').",
            "title": "Pool Id",
            "type": "string"
          }
        },
        "required": [
          "pool_id"
        ],
        "title": "ValidateOpportunityInput",
        "type": "object"
      },
      "use_when": "Delegate this check before deploying capital into a DeFi yield pool or staking opportunity when the caller needs an independent sustainability and liquidity decision.",
      "limitations": "Heuristic economic assessment based on DeFiLlama analytics and CoinGecko pricing. Does not audit smart contract bytecode, protocol governance, or admin key security.",
      "alternatives": [
        "get_yield_rates",
        "get_protocol_tvl",
        "get_lending_rates",
        "assess_counterparty_risk"
      ],
      "output_schema": {
        "$defs": {
          "DataProvenance": {
            "description": "Machine-readable source and freshness metadata for a tool response.",
            "properties": {
              "provider": {
                "title": "Provider",
                "type": "string"
              },
              "source_urls": {
                "items": {
                  "type": "string"
                },
                "title": "Source Urls",
                "type": "array"
              },
              "retrieved_at": {
                "title": "Retrieved At",
                "type": "string"
              },
              "source_fetched_at": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Source Fetched At"
              },
              "cache_hit": {
                "default": false,
                "title": "Cache Hit",
                "type": "boolean"
              },
              "cache_age_seconds": {
                "anyOf": [
                  {
                    "minimum": 0,
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Cache Age Seconds"
              },
              "cache_ttl_seconds": {
                "anyOf": [
                  {
                    "minimum": 0,
                    "type": "integer"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Cache Ttl Seconds"
              }
            },
            "required": [
              "provider",
              "retrieved_at"
            ],
            "title": "DataProvenance",
            "type": "object"
          },
          "LiquiditySummary": {
            "properties": {
              "tvl_usd": {
                "default": 0.0,
                "title": "Tvl Usd",
                "type": "number"
              },
              "tvl_30d_change_pct": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Tvl 30D Change Pct"
              },
              "chart_days": {
                "default": 0,
                "title": "Chart Days",
                "type": "integer"
              },
              "drain_detected": {
                "default": false,
                "title": "Drain Detected",
                "type": "boolean"
              }
            },
            "title": "LiquiditySummary",
            "type": "object"
          },
          "RiskFactor": {
            "properties": {
              "category": {
                "title": "Category",
                "type": "string"
              },
              "severity": {
                "enum": [
                  "high",
                  "medium",
                  "low"
                ],
                "title": "Severity",
                "type": "string"
              },
              "detail": {
                "title": "Detail",
                "type": "string"
              }
            },
            "required": [
              "category",
              "severity",
              "detail"
            ],
            "title": "RiskFactor",
            "type": "object"
          },
          "YieldSummary": {
            "properties": {
              "apy": {
                "default": 0.0,
                "title": "Apy",
                "type": "number"
              },
              "apy_base": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Apy Base"
              },
              "apy_reward": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Apy Reward"
              },
              "apy_mean_30d": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Apy Mean 30D"
              },
              "reward_share_pct": {
                "anyOf": [
                  {
                    "type": "number"
                  },
                  {
                    "type": "null"
                  }
                ],
                "default": null,
                "title": "Reward Share Pct"
              },
              "is_spiking": {
                "default": false,
                "title": "Is Spiking",
                "type": "boolean"
              }
            },
            "title": "YieldSummary",
            "type": "object"
          }
        },
        "properties": {
          "pool_id": {
            "title": "Pool Id",
            "type": "string"
          },
          "project": {
            "default": "",
            "title": "Project",
            "type": "string"
          },
          "symbol": {
            "default": "",
            "title": "Symbol",
            "type": "string"
          },
          "chain": {
            "default": "",
            "title": "Chain",
            "type": "string"
          },
          "verdict": {
            "enum": [
              "sustainable",
              "caution",
              "unsustainable",
              "insufficient_data"
            ],
            "title": "Verdict",
            "type": "string"
          },
          "sustainability_reason": {
            "title": "Sustainability Reason",
            "type": "string"
          },
          "risk_factors": {
            "items": {
              "$ref": "#/$defs/RiskFactor"
            },
            "title": "Risk Factors",
            "type": "array"
          },
          "yield_summary": {
            "$ref": "#/$defs/YieldSummary"
          },
          "liquidity_summary": {
            "$ref": "#/$defs/LiquiditySummary"
          },
          "partial_errors": {
            "items": {
              "type": "string"
            },
            "title": "Partial Errors",
            "type": "array"
          },
          "data_complete": {
            "default": true,
            "title": "Data Complete",
            "type": "boolean"
          },
          "provenance": {
            "$ref": "#/$defs/DataProvenance"
          },
          "as_of": {
            "title": "As Of",
            "type": "string"
          }
        },
        "required": [
          "pool_id",
          "verdict",
          "sustainability_reason",
          "provenance",
          "as_of"
        ],
        "title": "ValidateOpportunityOutput",
        "type": "object"
      },
      "reputation": {
        "reputation_score": 0.0,
        "success_rate": 0.0,
        "sample_size": 0.0,
        "confidence": 0.0,
        "freshness": 0.0,
        "average_latency_ms": 0.0
      }
    }
  ],
  "authentication": {
    "required": true,
    "scheme": "bearer",
    "type": "jwt",
    "token_endpoint": "/token"
  },
  "securitySchemes": {
    "bearer_jwt": {
      "httpAuthSecurityScheme": {
        "description": "JWT bearer token issued by Teardrop.",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "security": [
    {
      "bearer_jwt": []
    }
  ],
  "securityRequirements": [
    {
      "bearer_jwt": []
    }
  ],
  "iconUrl": "https://teardrop.dev/teardrop.png"
}