Skip to main content
Glama

Sato Hub: Build Onchain & Crypto Agents

Resolve an address, a mint or a link to the token it is

onchain_agent_resolve_token
Read-onlyIdempotent

USE WHEN a person or an agent has dropped a contract address, a Solana mint or a link and the next step needs to know what it IS before anything else happens: chain, address, name, symbol, decimals, token program, the main pool and that pool's liquidity, and the token's USD price. Read-only. NOT FOR what the chain says about the token's authorities, extensions and liquidity (use onchain_agent_preflight with token instead), a price source, or a swap quote (use onchain_agent_route_swap).

INPUT: a contract address (0x…) on Base, BNB Chain, Arbitrum, Polygon and Solana — pass chain (base, bnb, arbitrum, polygon, solana) to say which, or a bare 0x is read as Base and the answer says so — a Solana mint, or a link from dexscreener.com, geckoterminal.com, birdeye.so, pump.fun, gmgn.ai, basescan.org, bscscan.com, arbiscan.io, polygonscan.com, solscan.io, jup.ag, app.uniswap.org, aerodrome.finance, zora.co, clanker.world. The token is taken from the link's path with no request for the link itself; a DexScreener or GeckoTerminal pool link is resolved through their public API to the pool's BASE token (not the quote token). A link on another chain or another site, a profile page, or a bare symbol is refused with the reason — nothing is guessed. address/mint/token/url/link/contract are read as input, labelled; {} answers needs_input.

OUTPUT: every figure has an entry in sources naming where it was read and when; every null has an entry in gaps saying why (null is unknown, never zero). Decimals and the token program come from the chain when it answers. On Solana the mint's mint authority, freeze authority and Token-2022 extensions are read from the chain ({ set: false } is a revoked authority). Price and liquidity are ONE pool's listing from DexScreener (GeckoTerminal as a fallback) at the time given — never summed across pools or venues, not a quote, not a fill, not a price source: it is there to identify the token. Answers are held for 60 seconds per token.

RULE ENFORCED: this describes and recommends nothing, and says nothing about whether a token is safe. It is the step BEFORE evidence: run onchain_agent_preflight on the same token for what the chain says about its authorities, extensions and liquidity, and re-read decimals and the token program on-chain before signing anything.

RETURNS (json): { chain (one of: base, bnb, arbitrum, polygon, solana), chain_assumed (true only when a bare 0x address named no chain and Base was assumed), address, name, symbol, decimals, program: "erc20" | "spl" | "token-2022" | null, price_usd, liquidity_usd, main_pool: { venue, labels, address, quote_token: { address, symbol } } | null, mint_authority?, freeze_authority?, token2022_extensions? (Solana), sources: [{ field, source, as_of }], gaps: [{ field, reason }], resolved_from: { via, pool? }, checked_at, caveat, meta: { signature } }. Nothing at the address returns { resolved: false, code: "not_found", error }. Labels (rule, note…) are inside the signed body.

Example: { input: "https://dexscreener.com/base/0xc9034c3e7f58003e6ae0c8438e7c8f4598d5acaa" }

Input Schema

NameRequiredDescriptionDefault
urlNoRead as `input`.
linkNoRead as `input`.
mintNoRead as `input`.
chainNoOptional: base, bnb, arbitrum, polygon, solana (any common spelling: 'BNB Chain', 'bsc', 'matic', 'arbitrum one'). Must agree with the input; it supplies the chain a bare 0x address or a link leaves open (a Uniswap link with no chain). A bare 0x with no chain at all is read as Base.
inputNoWhat to resolve: a contract address (0x…) on Base, BNB Chain, Arbitrum, Polygon and Solana (name the chain; a bare 0x with none is read as Base and says so), a Solana mint (base58), or a link from dexscreener.com, geckoterminal.com, birdeye.so, pump.fun, gmgn.ai, basescan.org, bscscan.com, arbiscan.io, polygonscan.com, solscan.io, jup.ag, app.uniswap.org, aerodrome.finance, zora.co, clanker.world. A DexScreener or GeckoTerminal POOL link resolves to the pool's base token. A bare symbol is refused, never guessed.
tokenNoRead as `input`.
addressNoRead as `input`.
contractNoRead as `input`.
response_formatNoText format; structuredContent is JSON either way.markdown

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed11 schema fields changed
    • addedInput schema / properties / address
      Added value: +{
      +  "description": "Read as `input`.",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • changedInput schema / properties / chain / description
      Previous value: -"Optional: base, bnb, arbitrum, polygon, solana. Must agree with the input; it supplies the chain a bare 0x address or a link leaves open (a Uniswap link with no chain). A bare 0x with no chain at all is read as Base."New value: +"Optional: base, bnb, arbitrum, polygon, solana (any common spelling: 'BNB Chain', 'bsc', 'matic', 'arbitrum one'). Must agree with the input; it supplies the chain a bare 0x address or a link leaves open (a Uniswap link with no chain). A bare 0x with no chain at all is read as Base."
    • removedInput schema / properties / chain / enum
      Removed value: -[
      -  "base",
      -  "bnb",
      -  "arbitrum",
      -  "polygon",
      -  "solana"
      -]
    • addedInput schema / properties / chain / maxLength
      Added value: +40
    • addedInput schema / properties / contract
      Added value: +{
      +  "description": "Read as `input`.",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • removedInput schema / properties / input / minLength
      Removed value: -1
    • addedInput schema / properties / link
      Added value: +{
      +  "description": "Read as `input`.",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • addedInput schema / properties / mint
      Added value: +{
      +  "description": "Read as `input`.",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • addedInput schema / properties / token
      Added value: +{
      +  "description": "Read as `input`.",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • addedInput schema / properties / url
      Added value: +{
      +  "description": "Read as `input`.",
      +  "maxLength": 600,
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "input"
      -]
  2. Changed3 schema fields changed
    • changedInput schema / properties / chain / description
      Previous value: -"Optional. Must agree with the input; it only supplies a chain the input leaves open (a Uniswap link with no chain)."New value: +"Optional: base, bnb, arbitrum, polygon, solana. Must agree with the input; it supplies the chain a bare 0x address or a link leaves open (a Uniswap link with no chain). A bare 0x with no chain at all is read as Base."
    • changedInput schema / properties / chain / enum
      Previous value: -[
      -  "base",
      -  "solana"
      -]New value: +[
      +  "base",
      +  "bnb",
      +  "arbitrum",
      +  "polygon",
      +  "solana"
      +]
    • changedInput schema / properties / input / description
      Previous value: -"What to resolve: a contract address on Base (0x…), a Solana mint (base58), or a link from dexscreener.com, geckoterminal.com, birdeye.so, pump.fun, gmgn.ai, basescan.org, solscan.io, jup.ag, app.uniswap.org, aerodrome.finance, zora.co, clanker.world. A DexScreener or GeckoTerminal POOL link resolves to the pool's base token. A bare symbol is refused, never guessed."New value: +"What to resolve: a contract address (0x…) on Base, BNB Chain, Arbitrum, Polygon and Solana (name the chain; a bare 0x with none is read as Base and says so), a Solana mint (base58), or a link from dexscreener.com, geckoterminal.com, birdeye.so, pump.fun, gmgn.ai, basescan.org, bscscan.com, arbiscan.io, polygonscan.com, solscan.io, jup.ag, app.uniswap.org, aerodrome.finance, zora.co, clanker.world. A DexScreener or GeckoTerminal POOL link resolves to the pool's base token. A bare symbol is refused, never guessed."
  3. Added

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the annotations (readOnly/idempotent/openWorld), it discloses the 60-second per-token cache hold, the refusal-and-no-guessing behavior for unsupported links/symbols, that price and liquidity are a single pool's listing never summed across venues, and that decoding comes from the chain where possible. These are real operational traits the annotations do not carry.

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

Conciseness3/5

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

Front-loaded and clearly sectioned (USE WHEN / NOT FOR / INPUT / OUTPUT / RULE ENFORCED / RETURNS), which is good, but it is markedly over-long: the long supported-site enumeration in INPUT repeats the `input` schema description almost verbatim, and OUTPUT and RETURNS restate the same field list and pool caveat twice. Trimming the duplication would lose no information.

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?

With no output schema, the description carries the full return contract and does so thoroughly: field list including Solana-specific mint_authority/freeze_authority/token2022_extensions, the sources/gaps accounting for every figure and null, the not-found error shape, an example input, and the safety disclaimer. An agent has everything needed to call and interpret it.

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%, but several schema entries are just alias pointers ('Read as `input`'), so the description adds genuine meaning: a bare 0x with no chain is assumed Base and flagged via chain_assumed, `chain` must agree with the input, and a DexScreener/GeckoTerminal pool link resolves to the pool's base token. That is more than the schema alone conveys, though some of the site list is duplicated rather than added.

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 verb and resource ('Resolve an address, a mint or a link to the token it is') and enumerates exactly what comes back: chain, address, name, symbol, decimals, program, main pool + liquidity, USD price. It explicitly distinguishes itself from onchain_agent_preflight and onchain_agent_route_swap, so an agent can route without opening any schema.

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

Usage Guidelines5/5

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

A dedicated 'USE WHEN' clause defines the trigger ('someone dropped a contract address, a Solana mint or a link and the next step needs to know what it IS'), and 'NOT FOR' names the exclusions with the replacement tool for each (preflight, route_swap, price source). This is explicit when/when-not/alternative coverage.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.