Skip to main content
Glama

sui-mcp

CI

Read-only MCP server for investigating activity on Sui. Trace where funds went, attribute wallets to their funding sources, rank addresses by protocol flow, work out who can actually sign for a multisig treasury, and tell a coordinated cluster from a crowd, then reconstruct it all on a timeline.

67 tools. It also covers the ordinary things: wallet overviews, DeFi positions, NFTs, prices and Move package analysis.

Install

Add this to your MCP client config (Claude Code, Claude Desktop, Cursor, or anything else that speaks MCP over stdio):

{
  "mcpServers": {
    "sui": {
      "command": "npx",
      "args": ["-y", "sui-analytics-mcp"]
    }
  }
}

No account, API key, or config file is required. The server reads public Sui endpoints and defaults to mainnet. Requires Node.js >= 22.13.

Doing investigative work? Start with the forensics tools loaded:

"env": { "SUI_TOOLS": "core,forensics" }

Related MCP server: Sui MCP Server

What an investigation looks like

Ranking a lending protocol's wallets for a day, then testing whether a cluster is coordinated, in six calls:

aggregate_events(module: <package>, from: "2026-08-07T00:00:00Z", to: "now")
  → every event type it emits, with counts and the numeric fields available
    (user actions are usually far rarer than bookkeeping events)

aggregate_events(event_type: <DepositEvent>, value_field: "event.deposit_value", value_scale: 100)
  → wallets ranked by USD deposited, truncated: false

find_funding_sources(addresses: [...25], depth: "first_hop")
  → 23 of 25 share one funder, funded in three bursts of under a minute

get_address_fanout(<that funder>)
  → 1,623 recipients, classified "distributor", so shared funding alone
    proves nothing here; the second-level timing clusters carry the case

Several wallets tracing back to one funder looks decisive until you measure the funder itself. A distributor with 1,623 recipients funds unrelated wallets all day, so shared funding on its own says very little. Every funding result includes the fan-out measurement for this reason.

Fan-out reports shape as well as size. Measured on the same day, a known exchange and a sybil funder had almost identical counterparty counts, 399 and 431, but very different flow. The exchange ran balanced at 0.73 out/in, deposits in and withdrawals out. The funder ran 9.78, paying many addresses and being paid by few.

Multisig

A Sui address is the hash of whatever authenticates it. For a multisig, the threshold, every member key and every weight are part of that hash, so the committee can be read off the address and checked by deriving it and confirming it reproduces the address.

Identify a wallet and its committee. identify_address returns the shape, every member address, and each member resolved to its own name, labels and SuiNS history.

identify_address(0x045dadba…)
  → authentication: multisig, 4-of-7, verified: true
    committee_members: 7, each with name/label/kind

See which keys are actually used. The committee never changes, but who signs varies per transaction. analyze_multisig reads that across the wallet's history.

analyze_multisig(0x045dadba…, max_transactions: 200)
  → transactions_examined: 8
    signer_sets: [0,1,3,4] x4, [1,2,3,4] x2, [0,2,3,4] x2
    always_present: [3, 4]
    dormant_members: [5, 6]
    active_signers_meet_threshold: true

dormant_members are keys that hold weight and have never used it. always_present are keys the wallet currently cannot move without. Both are reported against transactions_examined, since the claim is only as good as the window.

See who authorised one transaction. get_transaction returns an authorization block naming the keys that signed and the members that did not, plus the gas sponsor when there is one.

get_transaction(oxrJ3Bppuk…)
  → authorization[0]: sender, multisig 4-of-7
      signed_by:     [0, 1, 3, 4]
      did_not_sign:  [2, 5, 6]

Search backwards from keys to a treasury. Given addresses a trace has already linked, find_shared_multisig derives every committee they could form and returns the ones that exist on chain. This finds multisigs that never appeared in the trace, since a wallet is only visible if it transacted with something you looked at.

find_shared_multisig([0xafe2fafa…, 0xc848c5cc…])
  → candidates_checked: 4, found: 1
    0xcf4e7b88… 1-of-2, evidence_tier: chain-derived

Clustering. build_wallet_edges emits a co_signer edge for any key that can spend a wallet on its own, and marks clusters built only from those chain-derived rather than heuristic. Keys sitting on more committees than the limit are treated as custody or wallet-provider keys and listed under excluded_co_signers instead of linking everyone who uses that provider.

Limits, also stated in the tool output. Member order is part of the address, so find_shared_multisig is factorial in committee size and refuses past five keys; it covers equal-weight committees only, so a nil result is not a negative finding. A wallet that has never sent a transaction cannot be classified at all, because it has produced no signature. It comes back as unknown rather than as an ordinary wallet.

zkLogin and passkey wallets go through the same path. zkLogin reports its OAuth issuer, which is all the chain discloses about the account.

What a result tells you about itself

Several tools qualify their own answers rather than returning a number that looks more certain than it is.

Is this coin the one you meant? A symbol is not an identifier on Sui. 8,008 mainnet coins share one with another, and imitators are named to be mistaken. analyze_token reports verified, and every balance change in a trace carries coin_verified:

-850 MAGMA (unverified, assumed scale)     coin_verified=false
+202.361728 USDC                           coin_verified=true

These are two separate marks. unverified refers to which coin it is. assumed scale refers to whether the amount is right: decimals for an unknown coin are a guess, and 47 of 289 imitators declare a different scale from the coin they imitate.

An ambiguous symbol returns candidates rather than a coin. USDC matches seven legitimate verified coins on Sui (Circle's, Wormhole's, Celer's), so picking one would misreport which asset moved.

Why did it fail? get_transaction returns the abort code with the package, module and function that raised it, and a clever error's constant name where the author defined one.

Who deployed this, and can they still change it? analyze_package and identify_address report publisher, the address that created the package, attributed to the lineage root. The UpgradeCap carries holder_status: burned means upgrade rights were renounced, which reduces risk, and is what 27 of every 30 departing caps did.

Has an issuer frozen this address? check_coin_restrictions reads the on-chain deny list in both directions. A frozen address usually holds none of the coin that froze it, so it checks every configured coin type rather than the ones it holds.

What moved that was not a coin? trace_funds reports object_flow. Sui is object-based, so a balance change only covers Coin<T>. An NFT, a Kiosk or a capability changes hands without producing one:

--- Hop 1 (2025-01-10 10:25:31 UTC) ---
Sender: 0x8c4f…5ee8
Action: Transfer to recipient
Objects:
  package::UpgradeCap ⚠  0x8c4f…5ee8 -> 0xeda2…6c2b
    Whoever holds this can publish new code for the package.

Kiosk moves are included. A kiosk-held NFT is owned by the Kiosk object, so an ordinary NFT trade reads object -> object, and that counts as a custody change. DeFi position objects are named by their protocol, for example position::Position (Cetus).

Transfers of UpgradeCap, TreasuryCap, DenyCap, DenyCapV2 and Publisher are marked as carrying control. A capability sent to an unspendable address is reported under renounced_capabilities instead, since those rights have been given up rather than transferred.

What has happened since I last looked? watch_addresses records a set of addresses and where it last looked; poll_watch returns only what is new:

{ "watched": 20, "active": 0, "hits": [], "requests": 1 }

That empty answer is 13 tokens and one request, so it is cheap to call repeatedly. Nothing triggers a poll on its own; the caller drives it. A hit names the address, digest, checkpoint and why it fired. It does not include the transaction, which you read separately with get_transaction:

reason

value_in / value_out

coin moved, with per-coin nets

capability_moved

mint, upgrade, freeze or publish rights changed hands

object_moved

an NFT, kiosk item or DeFi position changed hands

sink_reached

a counterparty carries a sink label

lookalike_appeared

a new counterparty renders like a watched address

appeared

something happened that moved no coin and no named object

Watching starts from the current checkpoint, so adding an address does not replay its history. min_amount filters coin movements only: a labelled sink or a transfer that moves no coin is reported whatever its size. An address busy enough to fill the per-poll cap is listed in more_pending rather than being silently truncated. Requires SUI_STORE_PATH.

Are these really the top holders? Only when complete_ranking is true. get_top_holders walks coin objects in object-id order, which is unrelated to balance. A scan that stops early returns the largest holder it happened to see. On SUI the reported top holder goes from 66 SUI at max_scan 200 to 3,454 at 800, with no overlap in the top five. A truncated scan therefore returns sampled_holders, without a rank or a percentage of supply, along with a caveat. Raise max_scan until truncated is false to get a real ranking; that is only practical for coins with few enough objects to enumerate. analyze_token reports the same distinction.

Is this address the one it looks like? get_transaction_history and trace_funds compare every address they touch and report address_poisoning when two of them are close enough to be mistaken for one another:

⚠ Addresses in this trace close enough to be mistaken for one another:
  0xd649a4d5…57127127  vs  0xd642ef27…c75d7127

An attacker generates an address sharing the leading and trailing characters of one you already deal with, sends dust from it, and waits for someone to copy the wrong row out of their own history. The check covers senders, balance-change recipients and the branches a trace declined to follow. A poisoning wallet sends rather than receives, so it never shows up as a counterparty, and the lookalike is usually several hops from the address it imitates.

A pair is reported when at least three characters match at each end, roughly one collision in seventeen million pairs by chance. The two addresses do not render identically at every width; they match at both ends, which is enough to fool a glance or a short truncation.

The address with the larger footprint is named as the established side, but only when the gap is wide enough to support it. Dust repeating inside a single page is normal for this attack, so a small margin proves nothing. Below that, the pair is reported with direction_known: false.

Does this address pay other people's gas? get_address_fanout reports sponsor_shape. This is invisible to value fan-out, since sponsoring moves none of the sponsor's own money. relayer is proven; private_sponsor off a truncated scan is flagged provisional, since breadth only grows with the window.

The forensics skill

The server gives Claude chain access, but not method: which tool answers which question, what a control group is for, and which conclusions to refuse. That lives in a skill shipped alongside it.

mkdir -p ~/.claude/skills
cp -r "$(npm root -g)/sui-analytics-mcp/.claude/skills/sui-forensics" ~/.claude/skills/

Or copy .claude/skills/sui-forensics/ out of this repo. It loads automatically once present; there is nothing to configure.

It covers the evidence tiers and what each one lets you claim, the order to work in, the base-rate check that keeps shared ancestry from reading as collusion, and the conclusions to refuse. "No edge found, so they are unrelated" is the most common of those.

Tool profiles

All 67 tools loaded at once cost about 14k tokens of context on every request, and a large flat tool list makes models pick the wrong tool. So the server starts with a core set of 17 and keeps the rest one call away.

When you ask for something outside the current set, such as "trace where these funds went", the model calls enable_tools and the tracing tools appear immediately, with no restart. You never have to pick a profile.

To start with more, set SUI_TOOLS:

"env": { "SUI_TOOLS": "core,forensics" }

Profile

Tools

Contents

core (default)

18

Wallets, balances, transactions (single and batched), tokens, NFTs, DeFi positions, staking, pools, names

forensics

29

Fund tracing, funding-source attribution, cross-chain bridge resolution, wallet-edge clustering, package analysis, control-group sampling, timelines, object provenance, labels, events, oracle-vs-market deviation, live address watching

developer

18

Move packages, disassembly, decompilation, upgrade diffing, dependency graphs, PTB decoding, unsigned transaction building, Move Registry

market

6

DeepBook order book and fills, pool stats, token search, validators

all

59

Everything

Runtime switching relies on notifications/tools/list_changed. Claude Code and Claude Desktop honour it; some clients cache the tool list and will only see the change after a restart. SUI_TOOLS always works, so set it explicitly if your client doesn't refresh.

Upgrading from 1.1.x, where every tool loaded at startup? Set SUI_TOOLS=all to keep that behaviour.

No wallet, no keys

The server has no credentials and no ability to move funds:

  • It never accepts a private key, mnemonic, or seed phrase. No tool takes one as an argument and nothing in the code reads one from the environment.

  • It never submits a transaction. build_transfer and build_staking return unsigned BCS bytes that you sign and broadcast somewhere else; simulate_transaction dry-runs bytes against a fullnode without executing them.

  • Every remaining tool is a read.

  • No provider accounts. RPC, indexing, and price data all come from public endpoints.

What the process actually does

Supply-chain scanners report which capabilities a package uses but not why. The full list for this one:

Capability

Where it's used

Network

Public Sui RPC and GraphQL, plus Pyth, Aftermath and the Move Registry for prices and name resolution. Hosts are listed in src/config.ts.

Filesystem

Temp files for decompile_module, and reading SUI_LABELS_FILE if you set it.

Subprocess

One call, in src/tools/decompiler.ts, to the decompiler binary you build and configure yourself. It uses execFile with array arguments, so no shell is involved and nothing is interpolated into a command string.

Environment

The SUI_-prefixed variables in .env.example, plus two optional price-provider keys (PYTH_API_KEY, CMC_API_KEY). Nothing else is read.

There is no eval, no dynamic require, no minified or obfuscated code, and no telemetry. Inputs that come from the chain are treated as untrusted: decompile_module validates module names before they reach a filesystem path, and bounds how many modules one call will process.

Most of the dependency tree is the MCP SDK. This server speaks stdio only and imports just server/mcp.js and server/stdio.js, so the SDK's HTTP-transport dependencies are installed but never loaded.

Verifying a release

Releases are published from CI with npm provenance, so every tarball carries a signed attestation tying it to the commit and workflow run that produced it:

npm audit signatures

Capabilities

  • Per-call network — every tool takes an optional network arg (mainnet / testnet / devnet); query multiple networks in one session (e.g. compare a testnet value to mainnet). SUI_NETWORK sets only the default.

  • Protocol-aware — decodes transactions from Cetus, Suilend, NAVI, Scallop, Bluefin, DeepBook, and more into human-readable actions

  • Incident investigation — labeled fund tracing, batch funding attribution with fan-out controls, multi-address timelines, object provenance, PTB anomaly triage, oracle-vs-market deviation

  • Multisig — a Sui address is the hash of its authenticator, so the committee is read off the address itself. Names every member, says which keys are live and which have never signed, and shows who signed a given transaction. Also handles zkLogin and passkey wallets

  • Move package analysis — disassembly, heuristic risk scan, capability audit, publisher attribution, upgrade-cap holder status, and upgrade diffing, none of which need an external binary

  • Asset verification — a curated coin registry, so a trace says whether the asset it followed is the real one rather than an imitator wearing its symbol

  • Multi-source architecture — gRPC for low-latency reads, GraphQL for filtered queries, archive node fallback for historical data

  • Price aggregation — Aftermath Finance, Pyth oracles, and CoinGecko in a single unified interface

  • Kiosk-aware — resolves NFT ownership through Sui's kiosk system to actual wallet addresses

  • Move Registry (MVR) — resolves names like @deepbook/core to package addresses, and back

Configuration

All environment variables are optional. See .env.example for the full list; the common ones are SUI_NETWORK (default network), SUI_FULLNODE_URL / SUI_GRAPHQL_URL (custom RPC endpoints), and SUI_LABELS_FILE (address attribution labels for fund tracing).

Price sources

Current USD prices come from Aftermath, which is free and needs no key. That is the default path, and it covers everything except historical pricing.

Two paid sources are opt-in and engage only when their key is set, so nobody is billed by accident and nothing degrades if you set neither:

Variable

Enables

PYTH_API_KEY

Historical prices (get_token_prices with at), oracle-vs-market comparison. Pyth's Hermes endpoint began requiring authentication for price values; feed discovery is still open.

CMC_API_KEY

CoinMarketCap as an additional current-price source. Note it keys on ticker symbols, which are not unique on-chain, so it is only consulted for symbols already mapped to a coin type.

Without a key, tools that need a paid source say so explicitly rather than returning a null price. A missing price and a price of zero mean different things.

Optional local store

Set SUI_STORE_PATH to keep address labels and fan-out measurements across sessions. It uses Node's built-in node:sqlite, so it adds no dependency and no native build. It is unset by default, and nothing is written to disk unless you set it. An investigation store is a record of which addresses you looked at, so that default is deliberate.

"env": { "SUI_STORE_PATH": "/Users/you/.local/share/sui-mcp/store.db" }

Fund traces are not cached. A trace depends on your label set, so a stored result would disagree with a fresh run as soon as a label changed.

{
  "mcpServers": {
    "sui": {
      "command": "npx",
      "args": ["-y", "sui-analytics-mcp"],
      "env": { "SUI_NETWORK": "testnet" }
    }
  }
}

Move decompiler (optional)

64 of the 67 tools need nothing beyond the install above. Only decompile_module requires an external binary, and there are lighter options to try first:

  • disassemble_module returns Move bytecode assembly via the GraphQL endpoint.

  • analyze_package summarizes a package's API and runs a heuristic risk scan.

  • diff_package_upgrade diffs two versions of a package.

Use the decompiler when you want higher-level, source-like Move output instead of bytecode.

The binary is Revela's move-decompiler, built from Rust. It is not bundled in the npm package because a published tarball could only carry one platform's build, so you compile it once yourself and point the server at it with SUI_DECOMPILER_PATH. This works the same whether you installed via npx or from source. You need a Rust toolchain (rustup.rs); the build takes a few minutes.

git clone --depth 1 https://github.com/verichains/revela_sui.git
cd revela_sui/external-crates/move
cargo build --release --bin move-decompiler
# binary lands at target/release/move-decompiler

Then add its absolute path to your client config:

{
  "mcpServers": {
    "sui": {
      "command": "npx",
      "args": ["-y", "sui-analytics-mcp"],
      "env": {
        "SUI_DECOMPILER_PATH": "/absolute/path/to/revela_sui/external-crates/move/target/release/move-decompiler"
      }
    }
  }
}

If you already cloned this repo, npm run build:decompiler does the same clone and build and copies the result to bin/move-decompiler.

Without SUI_DECOMPILER_PATH the server falls back to looking for move-decompiler on PATH. Prefer the absolute path: desktop clients often launch servers with a minimal environment that doesn't include your shell's PATH, so a binary you can run in a terminal may still be invisible to the server. If it's found in neither place, decompile_module returns an error explaining how to fix it, and the other 56 tools are unaffected.

Running from source

For development, or to run a version you've modified:

git clone https://github.com/0xfreak0/sui-mcp.git
cd sui-mcp
npm install
npm run build

Then point your client at the build output instead of npx:

{
  "mcpServers": {
    "sui": {
      "command": "node",
      "args": ["/absolute/path/to/sui-mcp/dist/index.js"]
    }
  }
}

See CONTRIBUTING.md for the development and release workflow.

Tools (67)

Tool

Description

identify_address

Identify what a Sui address is: wallet, package, validator, or object

get_wallet_overview

Comprehensive wallet overview: balances, SuiNS name, staking, kiosks, recent txs

get_transaction_history

Decoded activity feed with protocol names and human-readable actions

analyze_token

Full token analysis: metadata, price, 24h change, supply, top holders

Chain & Network

Tool

Description

get_chain_info

Current chain ID, epoch, checkpoint height, timestamp, gas price

get_checkpoint

Checkpoint details by sequence number or digest

Objects

Tool

Description

get_object

Object by ID with type, owner, JSON content, and display metadata

list_owned_objects

List objects owned by an address with optional type filter

list_dynamic_fields

Dynamic fields of an object (tables, kiosk contents, etc.)

Coins & Tokens

Tool

Description

get_balance

Balance of a coin type for an address (defaults to SUI)

get_coin_info

Token metadata: name, symbol, decimals, description, supply

search_token

Search tokens by name/symbol, with Aftermath Finance fallback

get_token_prices

USD prices for tokens — current (Aftermath + Pyth), or historical via Pyth when at is set

Transactions & Events

Tool

Description

get_transactions

Reads up to 50 transactions in ONE call given their digests — sender, timing, balance changes, Move calls, and events with decoded fields. Ten digests go from ten round trips to one. Malformed digests are rejected before the request, because the server refuses a whole batch over one bad key

get_transaction

Transaction by digest with protocol-decoded actions

query_transactions

Filter transactions by sender, address, object, or function

query_events

Filter events by type, sender, module, or checkpoint range

DeFi

Tool

Description

get_defi_positions

DeFi positions across Suilend, Cetus, NAVI, Scallop, Bluefin, Bucket

find_pools

Discover liquidity pools by token pair (Cetus, DeepBook, Turbos)

get_pool_stats

Pool reserves, fees, and prices for a given pool object ID (AMMs; see below for DeepBook)

DeepBook

DeepBook v3 is a central limit order book, so it has no reserves. Depth, spread and traded price come from the DeepBook indexer rather than from a pool object. Mainnet and testnet only.

Tool

Description

deepbook_orderbook

Live bid/ask depth, spread, mid price and resting-liquidity imbalance. Omit pool_name to list pools.

deepbook_trades

Recent fills with maker/taker balance manager IDs — attribute trading to an account during an incident window

compare_oracle_price

(Security) Pyth oracle price vs the price DeepBook actually traded at, over a window — detects stale feeds, manipulation windows, and liquidations priced at levels the market never printed

NFTs

Tool

Description

list_nfts

List NFTs owned by a wallet, including kiosk-stored NFTs

list_nft_collections

Lightweight collection summary with counts

get_top_holders

Holders of an NFT collection or token — a ranking only when the scan completes

Staking

Tool

Description

get_validators

List validators (stake, commission, voting power), or full detail for one when address is set

get_staking_summary

Wallet's staking positions and pools

Names

Tool

Description

resolve_name

SuiNS name resolution (forward and reverse)

Move Registry (MVR)

The Move Registry maps human-readable package names like @suins/core or @deepbook/core to on-chain package addresses. Backed by mainnet.mvr.mystenlabs.com/v1 (or testnet.mvr... when SUI_NETWORK=testnet).

Tool

Description

mvr_resolve

Resolve one or many MVR names → package IDs. Accepts version-pinned names like @suins/core/3.

mvr_reverse_resolve

Reverse-lookup: package addresses → MVR names. Useful for enriching raw addresses anywhere.

mvr_get_package_info

Full record for a name: metadata, version, package_address, package_info ID, git source.

mvr_search

Browse / search the registry. Supports substring search, pagination, and an is_linked filter for published packages.

mvr_resolve_struct

Resolve @org/app::module::Type → canonical type tag at the type's defining-package address.

Typical flows:

  • "What's the package for @deepbook/core?"mvr_resolve(['@deepbook/core'])0x4874e1.... Hand the address to get_package for module/function details.

  • "What is package 0xf22f…?"mvr_reverse_resolve(['0xf22f…'])@suins/core.

  • "Find DeepBook-related packages"mvr_search('deepbook', limit=20, is_linked=true) → paginated list.

  • "Pin to a specific version"mvr_resolve(['@suins/core/3']) returns the v3 package address rather than the latest.

Packages (Developer)

Tool

Description

get_package

Move package modules, structs (with ordered fields), and functions

get_move_function

Specific Move function signature and parameters

get_package_dependency_graph

Package dependency analysis with recursive traversal

analyze_package

Summarize a package's API + heuristic risk scan (no binary; accepts 0x id or MVR name)

disassemble_module

Disassemble Move bytecode via GraphQL (no binary; accepts 0x id or MVR name)

decompile_module

Decompile Move bytecode to source (requires decompiler binary)

diff_package_upgrade

(Security) Diff two package versions to spot what an upgrade changed — malicious-upgrade / backdoor detection

Transaction Building

Tool

Description

build_transfer

Build an unsigned transfer of SUI or any coin (auto coin selection); returns BCS for simulate_transaction

build_staking

Build an unsigned stake/unstake transaction (action: stake|unstake)

simulate_transaction

Dry-run a transaction to preview effects and gas cost

Advanced

Tool

Description

decode_ptb

Decode a Programmable Transaction Block from BCS bytes

check_activity

Monitor address or object for new activity since a checkpoint

Incident Investigation

Tool

Description

trace_funds

Swap-aware, USD-valued multi-hop fund tracing that stops at labeled sinks (forward or backward)

resolve_bridge_transfer

Follow funds across a bridge, in either direction. Resolves Wormhole (VAA identity (emitter chain, emitter address, sequence)), Sui's native bridge and Circle CCTP — the latter two carry the destination chain and recipient in their own events, so their far side needs no indexer at all. Detects Mayan MCTP and any package the registry types as a bridge. Inbound claims resolve to their origin chain and transfer id rather than being mistaken for exits. Every result is tiered: chain-derived trusts nobody, indexer-attested is a lead to confirm

find_funding_source

Walk an address back to its funding source(s) for attribution; stops at labeled exchanges/bridges

find_funding_sources

Same, for up to 100 addresses in one call — shares work across converging chains, reports shared funders with flow shape, addresses paid by one transaction (weighed against that transaction's full recipient count), subjects that funded each other, and sub-minute funding bursts

sample_control_addresses

Draw a random, reproducible control group from the same protocol and window, so a cohort's rate can be compared against chance

resolve_protocol_packages

Find which of a protocol's package versions are actually emitting now — the bundled registry is a decode map full of historical IDs, and querying one returns nothing

get_address_fanout

How many distinct addresses a funder pays. Tells an exchange hot wallet apart from a real common origin

build_wallet_edges

Finds addresses that may share an operator with the ones you give it, and shows the evidence. Multisig co-signature (read from the address hash, not inferred), shared first funder, direct funding, shared gas sponsor, or a third party paying both. Exchanges and relayers are measured and discarded first

analyze_multisig

For a multisig wallet, which committee keys are actually live and which have never signed, across its history. The committee is fixed for the life of the address; only who signs varies

find_shared_multisig

Given addresses you suspect are related, derive every committee they could form and find the multisig they jointly control — a hit is proof, since the address IS the hash of its committee

check_coin_restrictions

Read a regulated coin's on-chain deny list — which addresses its issuer froze, or whether a given address is frozen for the coins it holds. Chain-derived: it is the issuer's own decision, reversible by whoever holds the DenyCap

save_finding

Record a conclusion against a named case, so an investigation outlives its session

list_findings

List findings in a case, or every case with its count

export_case

Render a case as a Markdown report, highest-confidence findings first

delete_finding

Retract a finding that turned out to be wrong

aggregate_events

Rank wallets or event types by activity/value over a time window — "top wallets on this protocol today" in one call

build_timeline

Merge multiple addresses' activity into one checkpoint-ordered, protocol-decoded timeline

trace_object_history

Object provenance: version history + ownership transitions (who created/held an object when)

manage_labels

Address-label registry (exchanges, bridges, mixers, malicious wallets) used by the tracing tools

diff_package_upgrade

Diff two package versions to detect malicious upgrades / backdoors

License

MIT

Available Tools

19 tools
analyze_tokenA

(Recommended for token research) Get a comprehensive analysis of a Sui token in one call: metadata, current price, 24h change, total supply, and top 5 holders. Accepts either a coin type (e.g. '0x2::sui::SUI') or a name/symbol (e.g. 'DEEP', 'cetus').

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesToken name, symbol (e.g. 'USDC', 'deep'), or full coin type (e.g. '0x2::sui::SUI')
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
include_holdersNoInclude top 5 holders (default: true). Set false for faster response.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the returned data categories and input flexibility (coin type or symbol), but does not explicitly state that the call is read-only, nor does it mention rate limits, permissions, or error behavior. The 'get' and 'analysis' wording implies a safe read, but it is not explicit.

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 a single concise sentence plus an example, front-loaded with the recommendation and specific output list. Every sentence provides useful information with no redundancy.

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?

Given no output schema, the description compensates by listing exactly what is returned (metadata, price, change, supply, holders) and the accepted input formats. It does not explain error handling or network-specific behavior, but those are partially covered in the schema, so the description is sufficiently complete for an analysis tool.

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 description's note about accepting coin type or symbol essentially restates the query parameter's own description. The description adds no extra semantics beyond what the schema already provides; hence, the baseline of 3 applies.

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 explicitly states 'Get a comprehensive analysis of a Sui token' and enumerates specific data points (metadata, current price, 24h change, total supply, top 5 holders), clearly distinguishing it from price-only tools like get_token_prices or balance tools.

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?

Opens with '(Recommended for token research)' signaling the intended use case, and the description implies a comprehensive analysis without naming alternatives. However, it does not explicitly compare with sibling tools such as get_token_prices or identify_address, so it lacks explicit when-not instructions.

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

enable_toolsA

Turn on additional Sui tool profiles for this session. This server ships a small default tool surface and keeps the rest one call away. Call this FIRST whenever the capability you need is not in your current tool list — the tool probably exists and is simply disabled. Do not reimplement a listed tool by hand.

'core' — Everyday lookups — wallets, balances, transactions, tokens, NFTs, DeFi positions. Tools: identify_address, get_wallet_overview, get_transaction, get_transactions, get_transaction_history, query_transactions, get_object, list_owned_objects, get_balance, analyze_token, get_token_prices, list_nfts, list_nft_collections, get_defi_positions, get_staking_summary, find_pools, resolve_name, get_chain_info 'forensics' — Incident investigation — fund tracing, batch funding attribution, address fan-out, live wallet-edge clustering, package analysis, multi-address timelines, object provenance, address labels, cross-chain bridge resolution, oracle-vs-market deviation, and recording findings into an exportable case report. Tools: resolve_protocol_packages, sample_control_addresses, trace_funds, resolve_bridge_transfer, find_funding_source, find_funding_sources, get_address_fanout, build_wallet_edges, analyze_multisig, find_shared_multisig, check_coin_restrictions, analyze_package, get_package, get_move_function, disassemble_module, build_timeline, trace_object_history, manage_labels, query_events, check_activity, get_top_holders, compare_oracle_price, aggregate_events, save_finding, list_findings, export_case, delete_finding 'developer' — Move package analysis — modules, disassembly, decompilation, upgrade diffing, dependency graphs, PTB decoding, unsigned transaction building, Move Registry. Tools: get_package, get_move_function, get_package_dependency_graph, analyze_package, disassemble_module, decompile_module, diff_package_upgrade, decode_ptb, simulate_transaction, build_transfer, build_staking, get_checkpoint, list_dynamic_fields, mvr_resolve, mvr_reverse_resolve, mvr_get_package_info, mvr_search, mvr_resolve_struct 'market' — Market data — DeepBook order book and fills, pool stats, token search, validators. Tools: deepbook_orderbook, deepbook_trades, get_pool_stats, search_token, get_coin_info, get_validators

Use 'all' for everything. Newly enabled tools are callable immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoProfile to enable, or 'all'. Accepts several: ['forensics','developer'].
profilesNoAlias for `profile`. Same values; use whichever reads better.

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It explains the session-scoped effect ("for this session"), the lazy-enablement model, and the consequence ("Newly enabled tools are callable immediately"). It does not describe the return value or what happens if a profile is already enabled, but the core behavioral traits are clearly disclosed.

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

Conciseness4/5

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

The description is long but well-structured: purpose, usage rule, then a consistent profile-by-profile layout ending with the 'all' shortcut and immediate availability. The forensics profile's prose is somewhat dense and lists many capabilities in a run-on style, but the overall structure is navigable and front-loaded with the most important guidance.

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?

Given the tool's meta-purpose and minimal schema, the description is complete: it explains when to call it, what each parameter value grants, which tools become available, and that effects are immediate. No output schema exists, but the outcome of calling this tool is the availability of other tools, which is fully stated. There are no missing details an agent would need to use it correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the schema only says "Profile to enable, or 'all'." The description adds substantial semantic value by enumerating each profile ('core', 'forensics', 'developer', 'market'), describing its domain, listing the exact tools it enables, and clarifying the special value 'all'. It also explains the alias relationship by saying the `profiles` parameter takes the same values.

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: "Turn on additional Sui tool profiles for this session." It also clarifies what the tool is not by explaining that the server "ships a small default tool surface and keeps the rest one call away," which distinguishes it from the individual lookup tools listed as siblings.

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?

Usage guidance is explicit: "Call this FIRST whenever the capability you need is not in your current tool list — the tool probably exists and is simply disabled." It also warns against an incorrect alternative behavior: "Do not reimplement a listed tool by hand." This is direct, actionable, and leaves no ambiguity about when to invoke the tool.

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

find_poolsA

Find DeFi liquidity pools by token pair. Searches Cetus, DeepBook, and Turbos for pools matching the given tokens. Use get_pool_stats on a returned pool_id for detailed stats.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
token_aYesFirst token: symbol (e.g. 'SUI') or full coin type
token_bYesSecond token: symbol (e.g. 'USDC') or full coin type
protocolNoFilter by protocol: 'cetus', 'deepbook', or 'turbos'. Searches all if omitted.

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full transparency burden. It reveals that the tool searches across specific DEXs and returns a pool_id, but does not disclose result format, potential empty results, sorting, or pagination behavior. This is adequate for a simple read-only search but lacks depth.

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?

Three concise sentences: the first states purpose, the second explains search scope, the third points to a follow-up. No filler or redundancy; purpose is front-loaded.

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 search tool with no output schema, the description covers the primary use case, the exact protocols searched, and a clear next step. It mentions pool_id as a return field, but does not describe the full result structure or edge case behavior. Still, it is sufficient 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 100% of parameters with descriptions for token_a, token_b, network, and protocol. The tool description only mentions 'token pair' and 'tokens', which adds no meaning beyond the schema. The baseline of 3 applies because the schema carries the semantic load.

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 'Find DeFi liquidity pools by token pair' — a specific verb and resource that clearly states the tool's function. It also names three protocols (Cetus, DeepBook, Turbos) it searches, which differentiates it from adjacent tools like get_defi_positions.

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 usage context: use when you have a token pair and need to find matching liquidity pools. It explicitly recommends get_pool_stats for subsequent detail, giving a follow-up path. However, it does not contrast with siblings or state when not to use this tool.

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

get_balanceA

Get the liquid balance of one coin type for a Sui address (defaults to SUI), optionally at a historical checkpoint. This counts spendable coins ONLY: staked SUI and value locked in DeFi positions do not appear here, so a wallet that looks nearly empty may not be — pair it with get_staking_summary and get_defi_positions before concluding anything about what an address holds. For every coin at once, use get_wallet_overview.

ParametersJSON Schema
NameRequiredDescriptionDefault
ownerYesOwner address (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
coin_typeNoCoin type (default: 0x2::sui::SUI)
at_checkpointNoQuery balance at a specific checkpoint (for historical balances)

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the behavioral burden. It clearly discloses that only spendable/liquid coins are counted and explicitly calls out exclusions (staked SUI, DeFi positions), which is exactly the kind of non-obvious behavior an agent needs. It does not describe return format or unit handling, but the core behavioral ambiguity is well addressed.

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, front-loaded with the primary action, and every sentence adds distinct value: the core function, the critical exclusions/nuance, and the sibling alternative. There is no filler or redundancy.

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?

The description covers selection, semantics, and the main edge cases, which is strong for a 4-parameter tool. However, there is no output schema and the description does not specify the return unit or format of the balance value. This is a minor gap but still leaves some ambiguity for an agent invoking the tool.

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 owner, network, coin_type, and at_checkpoint, including defaults. The description adds the important 'liquid only' framing and the distinction from other tools, but it does not significantly expand on the individual parameters beyond what the schema provides. 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 uses a specific verb and resource: 'Get the liquid balance of one coin type for a Sui address'. It also notes the SUI default and the optional historical checkpoint, and clearly distinguishes itself from get_wallet_overview (all coins at once) and get_staking_summary/get_defi_positions (non-liquid holdings).

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?

The description gives explicit when-to-use and when-not-to-use guidance. It states that staked SUI and DeFi value are excluded, advises pairing with get_staking_summary and get_defi_positions before drawing conclusions, and directs users to get_wallet_overview when every coin type is needed.

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

get_chain_infoA

Get current Sui network info: chain ID, epoch, checkpoint height, timestamp, and reference gas price. Optionally pass an epoch number to get details for a specific epoch.

ParametersJSON Schema
NameRequiredDescriptionDefault
epochNoEpoch number to query. Returns current epoch info if omitted.
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosing behavior. It lists the returned fields, which gives insight into output, and implies a read-only operation. However, it does not explicitly state side effects, error behavior, or default network selection, leaving some gaps for a complete transparency profile.

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 long, front-loaded with the core purpose, and every word adds value. It avoids repetition and clearly introduces the optional parameter in the second sentence.

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?

Given the tool's simplicity, no annotations, and fully described schema, the description covers the essential behavior. It names all returned fields and explains the epoch option. The lack of an output schema is partially compensated by the field list, though a more explicit response structure could improve completeness.

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 already fully describes both parameters with high coverage (100%). The description's mention of 'optionally pass an epoch number' reinforces but does not add new semantic detail beyond the schema. The network parameter's detailed description is already in the schema, so the description adds no extra value here.

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 'Get current Sui network info' and enumerates specific fields (chain ID, epoch, checkpoint height, timestamp, reference gas price), making the tool's function unambiguous. It is distinct from sibling tools like get_object or get_transaction, which target other data types.

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 a clear use case: retrieving current network info, and also explains the optional epoch parameter for querying specific epochs. While it does not explicitly name alternatives or exclusion criteria, the context is sufficient given that no sibling tool offers this functionality.

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

get_defi_positionsA

Find DeFi positions owned by a Sui wallet across major protocols: Suilend, Cetus LP, NAVI, Scallop, Bluefin, Bucket, and staked SUI. Returns extracted position summaries (deposits, borrows, liquidity, fees) instead of raw on-chain data.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesWallet address (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are present, so the description carries the transparency burden. It discloses a key behavioral trait: it returns extracted position summaries (deposits, borrows, liquidity, fees) rather than raw on-chain data. However, it offers no detail on permissions, pagination, or behavior for addresses with no positions.

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 at two sentences, starts with the action, and includes an enumerated list of protocols without extraneous language. Every sentence contributes useful information.

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?

The description outlines the tool's scope and the nature of the returned data, which is important because no output schema is provided. It could be more explicit about return edge cases (e.g., empty positions) or network-specific behavior, but the schema's full coverage of network/address parameters helps. Overall, it is sufficient for an agent to decide when to invoke the tool.

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 input schema already fully documents both parameters (address and network) with descriptions, so the baseline is 3. The tool description doesn't add any additional parameter-level semantics beyond what the schema provides.

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 identifies the tool's purpose: finding DeFi positions owned by a Sui wallet. It enumerates covered protocols (Suilend, Cetus LP, NAVI, Scallop, Bluefin, Bucket, and staked SUI), which differentiates it from sibling tools like get_balance or get_staking_summary. The verb 'Find' and resource 'DeFi positions' are specific.

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 when a wallet's DeFi positions across specific protocols are needed, but it provides no explicit guidance on when to choose this tool over siblings such as get_wallet_overview or get_staking_summary. There are no stated exclusions or alternative tool recommendations.

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

get_objectA

Get a Sui object by its ID. Returns type, owner, version, content (JSON), and digest. Automatically extracts display metadata (name, description, image_url) for NFTs.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
versionNoSpecific version to fetch
object_idYesThe object ID (0x...)

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden and does well by listing the returned fields (type, owner, version, content JSON, digest) and the automatic extraction of NFT display metadata. It could be more thorough about error handling, but it clearly conveys the operational behavior.

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 only two sentences, starts with the main action, and has no filler or redundant content. It is concise and well-structured.

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 get tool, the description adequately explains the output and special NFT handling. The parameter schema is comprehensive, and no output schema exists. It lacks sibling comparison guidance, but that is covered under usage guidelines. Overall, it is 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?

The input schema already contains full descriptions for all three parameters (object_id, network, version), so the description adds no additional parameter detail. Per the rubric, a baseline of 3 is appropriate given 100% schema coverage.

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 'Get a Sui object by its ID', which specifies the exact action and target. It distinguishes itself from sibling tools like list_owned_objects and get_transaction by focusing on retrieving a single object by ID.

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 usage is implied: use this when you have a specific object ID to fetch. However, it does not explicitly state when to prefer this over alternatives like list_owned_objects, nor does it mention any exclusions or complementary tools.

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

get_staking_summaryA

Get a wallet's staking positions: every StakedSui object with its validator pool, principal, and activation epoch. Worth calling during an investigation or a net-worth check, because staked SUI does NOT appear in get_balance — a wallet that looks nearly empty can hold a large staked position, and the stake also ties it to a specific validator.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesWallet address (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the disclosure burden and does so well: it reveals that staked SUI is omitted from get_balance, that the tool surfaces these otherwise-hidden positions, and that the result ties the wallet to a specific validator. It could add details about errors or pagination, but the key non-obvious behavior is disclosed.

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 focused sentences: the first states the tool's core behavior, the second provides the critical usage context. There is no filler or repetition, and 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 low-complexity tool with only one required parameter and a fully documented schema, the description is complete: it explains what is returned, why the tool matters, and how it relates to get_balance. No output schema exists, so the return-value details in the description are especially valuable and sufficient.

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 parameters are already well documented. The description adds no additional parameter-level detail beyond what the schema provides, keeping this at the baseline score.

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 operation ('Get a wallet's staking positions'), a concrete resource ('every StakedSui object'), and the exact data returned (validator pool, principal, activation epoch). It also differentiates from get_balance by explicitly noting that staked SUI does not appear in balance results.

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 when to use the tool ('during an investigation or a net-worth check') and explains the gap with get_balance. It does not explicitly state when not to use it or mention overlapping alternatives such as get_defi_positions, so it lacks a full exclusion list.

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

get_token_pricesA

Get USD prices for Sui tokens — current by default, or historical when at is set. Current prices use Aftermath (primary) + Pyth (fallback); historical prices use the Pyth oracle at the given time. Accepts full coin type strings (e.g. 0x2::sui::SUI).

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoOptional: price AT this point in time — Unix seconds or ISO 8601 (e.g. '2025-01-15T00:00:00Z'). Omit for current prices.
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
coin_typesYesArray of full coin type strings (e.g. ['0x2::sui::SUI', '0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC'])

TDQS

A4/5.0
Behavior4/5

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

With no annotations provided, the description carries full behavioral disclosure burden. It reveals that current prices use Aftermath with Pyth as fallback, and historical prices rely on the Pyth oracle at the given time, which provides meaningful insight into data source reliability. However, it does not mention failure modes (e.g., what happens if a price is unavailable) or rate limits.

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 extremely concise, using three short sentences to convey the primary purpose, data source behavior, and input format. Every sentence adds value with no fluff, and the most important information (what it does) is front-loaded.

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 read-only price query tool with no output schema, the description covers the core functionality, historical vs. current behavior, data sources, and required input format. It lacks explicit return structure (e.g., mapping from coin type to price) but the simplicity of the tool makes this acceptable. The network parameter is not mentioned in the description, though it is thoroughly documented in the schema.

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?

All parameters are fully described in the schema (100% coverage), so the description adds only redundant reinforcement (e.g., 'Accepts full coin type strings'). It does not provide new semantic meaning beyond the schema, such as return format or unit details, so a baseline score of 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 clearly states the tool gets USD prices for Sui tokens, with a specific distinction between current and historical prices via the `at` parameter. It also specifies the data sources (Aftermath, Pyth) and input format, making it distinct from sibling tools like get_balance or analyze_token.

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 explains when to use current vs. historical modes (when `at` is set) but does not explicitly compare against alternative sibling tools like analyze_token. It provides context on data source fallback but lacks explicit 'use this when' or 'instead of' guidance.

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

get_transactionA

Get a Sui transaction by its digest. Returns sender, status, gas, balance changes, protocol-aware decoded actions (e.g. 'swap on Cetus', 'deposit on Suilend'), and events WITH their decoded fields — so there is no need to hand-write GraphQL to read an event's values. Protocols are identified from the events as well as the Move calls, which matters when a transaction calls an obfuscated wrapper: protocols_from_events_only marks that case.

ParametersJSON Schema
NameRequiredDescriptionDefault
digestYesTransaction digest (Base58)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
max_event_field_bytesNoOptional byte cap on decoded event fields. UNSET BY DEFAULT: every event comes back with its fields, because an investigation must not be silently working from a subset. Set this only when you knowingly want to bound the payload — anything skipped is reported — or set 0 to skip decoding entirely.

TDQS

A3.9/5.0
Behavior4/5

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

No annotations are provided, so the description carries the behavioral disclosure burden. It is transparent about returned fields, decoded event values, and the protocol-identification nuance for obfuscated wrappers, plus the default behavior for max_event_field_bytes is covered in the schema. It does not describe not-found handling or errors, but the disclosed behavior is material and specific enough for an agent to understand what happens when the tool is called.

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

Conciseness4/5

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

The purpose is front-loaded and the description is information-dense, explaining why decoded events matter and flagging the obfuscated-wrapper edge case. It is slightly long, but every clause adds value and there is no filler; the examples such as 'swap on Cetus' make the behavior concrete.

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?

Given no output schema and no annotations, the description does a strong job of covering return contents and a subtle behavioral edge case, which is enough for a read-style tool. It could also specify behavior for missing digests or error responses and clarify where the `protocols_from_events_only` marker appears, but nothing essential for invoking with a digest is missing.

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 the schema already fully documents digest, network, and max_event_field_bytes. The description adds little parameter-specific meaning beyond contextualizing decoded event fields; it mostly reinforces schema guidance. Baseline 3 is appropriate since the structured schema does the heavy lifting.

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?

Opens with a specific verb and resource: 'Get a Sui transaction by its digest.' It goes beyond a generic getter by enumerating the exact payload — sender, status, gas, balance changes, decoded events and protocol-aware actions — and 'by its digest' clearly separates it from sibling listing/query tools like query_transactions and get_transactions.

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 fetching a single transaction when the caller already has a digest, and it communicates the value of getting decoded event fields without hand-writing GraphQL. However, it never explicitly states when to prefer this over query_transactions/get_transactions, nor does it give exclusions, so the usage guidance is implied rather than explicit.

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

get_transaction_historyA

(Recommended for wallet activity) Get decoded transaction history for a Sui wallet. Returns a human-readable activity feed with protocol names (e.g. Cetus, Suilend), action descriptions (e.g. 'Swap USDC → SUI'), and token flow. Prefer this over query_transactions when exploring what a wallet has been doing.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoPagination cursor for next page
limitNoNumber of transactions to return (default 10, max 50)
addressYesSui wallet address (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It adds valuable context by describing the output as 'decoded' and 'human-readable,' implying a read-only, user-friendly feed. But it does not mention any potential limitations, rate limits, or error behavior, leaving some transparency gaps.

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 three sentences, each serving a clear purpose: stating recommendation, defining functionality with concrete examples, and providing usage guidance. There is no redundancy or unnecessary detail.

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?

Given the full schema coverage for parameters and a clear, detailed description of purpose and output, the description is nearly complete. It could mention pagination or network behaviors explicitly, but those are already covered by the schema, so it does not need to.

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%, meaning all parameters are already documented in the input schema. The description adds no additional parameter-specific guidance beyond what the schema provides, so the baseline score of 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 clearly states the tool's function: to get decoded transaction history for a Sui wallet, with specific output details like protocol names and token flow. It also distinguishes itself from the sibling query_transactions by explicitly recommending it for exploring wallet activity.

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 explicit usage context with 'Recommended for wallet activity' and directly names an alternative: 'Prefer this over query_transactions when exploring what a wallet has been doing.' However, it lacks a clear 'when not to use' statement, so it doesn't fully cover both sides.

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

get_transactionsA

Read up to 50 Sui transactions in ONE call, given their digests. Returns sender, status, timing, balance changes, Move call targets and events WITH their decoded fields for each, plus the protocols involved. Use this whenever you hold several digests at once — the outputs of a fan-out, the evidence on a cluster edge, a set of hops to compare — instead of calling get_transaction repeatedly; ten digests go from ten round trips to one. Digests that could not be read come back in not_found rather than being dropped. For ONE transaction, or for a transaction with more than 50 events, prefer get_transaction: it pages events to the end.

ParametersJSON Schema
NameRequiredDescriptionDefault
digestsYesTransaction digests, Base58 (1-50). Duplicates are collapsed.
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral disclosure burden. It reveals that not-found digests are returned in a `not_found` list rather than dropped, that duplicates are collapsed (in schema as well), and that get_transaction should be used when there are more than 50 events because this batch tool pages events differently. It also clearly frames the operation as read-only by starting with 'Read', which is important since no readOnlyHint is available.

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 dense but every clause earns its place. It front-loads the core capability, then return contents, then concrete use cases, then edge-case behavior, then the alternative. It avoids filler and is organized so an agent can quickly extract purpose, usage, and limitations.

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, no-output-schema tool, this description is remarkably complete. It specifies input semantics (digests, network), batch limit (50), behavior when digests are missing, return value highlights, and the boundary with the single-transaction sibling. An agent has enough information to select the tool and invoke it correctly for both common and edge cases.

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%: both `digests` and `network` already include detailed descriptions in the schema, including Base58 format, min/max items, duplicate collapsing, and network enum semantics. The tool description does not add meaning beyond what the schema provides for these parameters; it only adds usage context. This meets the baseline for high schema coverage but does not exceed it.

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-object pair: 'Read up to 50 Sui transactions in ONE call, given their digests.' It clearly identifies the resource (transactions by digest), the batch scope, and the key returned fields (sender, status, timing, balance changes, move call targets, events with decoded fields, protocols). It also explicitly contrasts with the sibling get_transaction, making differentiation effortless.

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?

The description gives explicit when-to-use guidance: 'Use this whenever you hold several digests at once' with concrete examples (fan-out outputs, cluster edge evidence, hops to compare). It states the alternative and the exact condition for switching: 'For ONE transaction, or for a transaction with more than 50 events, prefer get_transaction.' No inference is required.

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

get_wallet_overviewA

(Recommended first tool for wallets) Get a comprehensive overview of a Sui wallet: all token balances, SuiNS name, staked SUI count, kiosk/NFT count, and recent transactions. Set include_prices=true for USD values and total portfolio value. Start here before drilling into specific tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesWallet address (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
include_pricesNoInclude USD prices and portfolio value (default: false)

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose the scope of the return data (balances, SuiNS, staking, NFTs, transactions) and the include_prices option for USD values. However, it omits potential caveats such as pagination, performance limits, or network-specific behavior, which leaves some gaps for a comprehensive aggregate tool.

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 long, with the first sentence front-loading the tool's purpose and contents, and the second giving a concise parameter tip. Every word earns its place, and there is 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?

Although there is no output schema, the description sufficiently enumerates the major return categories (token balances, SuiNS name, staked SUI count, kiosk/NFT count, recent transactions) and explains the optional price inclusion. It also provides a clear usage context relative to sibling tools. It does not detail the exact result structure, but for a high-level overview tool this is acceptable and the sibling tools can provide more depth.

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 input schema already covers all parameters with detailed descriptions (100% coverage), so the baseline is 3. The description adds marginal value by highlighting include_prices as the way to get USD values and portfolio value, but this largely mirrors what the schema already explains. No additional syntax or format details are provided 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 begins with a clear verb ('Get') and resource ('comprehensive overview of a Sui wallet'), and explicitly enumerates the included data (token balances, SuiNS name, staked SUI count, kiosk/NFT count, recent transactions). It also positions itself as the recommended first tool, which distinguishes it from sibling tools like get_balance or list_nfts.

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 explicit usage guidance: 'Recommended first tool for wallets' and 'Start here before drilling into specific tools.' It clearly indicates when to use this tool as an entry point and implies that more specific tools should be used afterward. It does not name specific alternative tools, but the directive is clear and actionable.

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

identify_addressA

(Recommended first step) Identify what a Sui address is: wallet, package, validator, or object. Returns a type classification with contextual summary (e.g. balance + SuiNS for wallets, module list for packages, stake info for validators). Use this before deciding which other tools to call.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesSui address or object ID (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the burden of behavioral disclosure. It clearly states that the tool returns a type classification plus contextual summaries with specific examples (balance + SuiNS for wallets, module list for packages, stake info for validators). This conveys the operational behavior and output richness without needing to describe side effects (as it is a read-only identification).

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. The first sentence states the core purpose and classification types; the second sentence describes the output and provides usage guidance. Every sentence earns its place, and the key information is 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?

Given the tool's simplicity (2 params, no output schema, no annotations), the description covers the essential function, the nature of the return value, and when to use it relative to other tools. It is complete enough for an agent to select and invoke it 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?

Schema description coverage is 100%, so the baseline is 3. The description adds general context about what the return will be but does not add parameter-level detail beyond the schema. The schema already clearly describes 'address' and 'network', so the description is not required to compensate.

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 uses a specific verb ('Identify') and resource ('Sui address'), and clearly enumerates the classification categories (wallet, package, validator, object). This distinguishes it from sibling tools that query specific types (e.g., get_object, 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 Guidelines4/5

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

The description explicitly recommends it as the 'Recommended first step' and says 'Use this before deciding which other tools to call,' giving clear when-to-use context. It does not explicitly name alternatives or state when not to use it, but the positioning is sufficient for a helper/classifier tool.

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

list_nft_collectionsA

Get a lightweight summary of NFT collections owned by a wallet. Walks all kiosks plus direct-owned objects and returns deduplicated collection types with counts. Backed by GraphQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesOwner wallet address (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations provided, the description carries the full transparency burden. It discloses key behaviors: it walks multiple sources ('kiosks plus direct-owned objects'), deduplicates, and returns a 'lightweight summary' with counts. It also mentions 'Backed by GraphQL' as an implementation detail. This adds meaningful context beyond the tool name and schema.

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, front-loaded with the primary purpose in the first sentence and behavioral details in the second. Every sentence adds value without redundancy or unnecessary elaboration.

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?

The description is complete for a read-only summary tool. It explains what the tool does, how it operates (walking kiosks and direct-owned objects), what the output contains (deduplicated collection types with counts), and is backed by GraphQL. Given the simple two-parameter schema and absence of an output schema, the description sufficiently covers the tool's behavior and expected 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?

The input schema provides 100% coverage for both parameters (address and network). The description does not add additional parameter-specific meaning beyond what the schema already states. Per the baseline rule for high schema coverage, this is a 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's function: 'Get a lightweight summary of NFT collections owned by a wallet.' It specifies the resource and action, and further clarifies scope by mentioning 'Walks all kiosks plus direct-owned objects and returns deduplicated collection types with counts,' distinguishing it from siblings like list_nfts and list_owned_objects.

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 a clear use case: obtaining a high-level NFT overview. It provides context by explaining it traverses kiosks and direct-owned objects and returns deduplicated collection types, which helps differentiate it from more detailed tools. However, it does not explicitly name alternatives or state when not to use this tool.

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

list_nftsA

(Recommended for NFTs) List NFTs owned by a wallet, including kiosk-stored NFTs. Returns display metadata (name, description, image URL) and raw Move struct contents inline. Backed by GraphQL — single query per kiosk page, no fullnode rate-limit risk. Pagination: pass cursor from a prior response to fetch the next page; the response omits next_cursor when the wallet is fully enumerated. May slightly overshoot limit because GraphQL pages are 50-at-a-time and we don't break mid-page. Use list_nft_collections for a cheaper count-only summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoTarget page size (default 50, max 1000). Result may slightly exceed this at GraphQL page boundaries.
cursorNoOpaque pagination token from a prior response's `next_cursor`. Omit on first call.
addressYesOwner wallet address (0x...)
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A4.9/5.0
Behavior5/5

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

No annotations exist, so the description carries full responsibility. It discloses pagination behavior ('pass cursor... next_cursor omitted when wallet is fully enumerated'), GraphQL page-boundary overshoot, and response contents (display metadata + raw Move structs). This is exceptionally transparent for a list tool.

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?

Every sentence earns its place: scope, response contents, backend rationale, pagination mechanics, and alternative. No filler or redundancy; front-loaded with the core purpose.

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 annotations or output schema, the description fully covers what the tool does, when to use it, how pagination works, and which sibling covers a different need. It leaves no ambiguity for correct invocation.

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 covers all 4 params with descriptions (100% coverage), so baseline is 3. Description adds meaning to limit and cursor by explaining the overshoot rationale and the next_cursor omission behavior, which goes beyond schema text. Incremental context justifies a 4.

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 'List NFTs owned by a wallet, including kiosk-stored NFTs' — a specific verb, resource, and scope. It also explicitly says '(Recommended for NFTs)' which differentiates it from sibling tools like list_owned_objects and list_nft_collections.

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?

Provides an explicit alternative: 'Use list_nft_collections for a cheaper count-only summary.' Also explains the GraphQL backend benefit ('no fullnode rate-limit risk') which clarifies when this tool is preferable to fullnode-backed alternatives.

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

list_owned_objectsA

List raw objects owned by a Sui address with optional type filter and pagination. For NFTs specifically, prefer list_nfts (resolves kiosk storage, extracts display metadata). For a wallet summary, prefer get_wallet_overview.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 50, max 1000)
ownerYesOwner address (0x...)
cursorNoPagination cursor from previous response
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
object_typeNoFilter by object type (e.g. 0x2::coin::Coin<0x2::sui::SUI>)

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses key behavioral traits such as 'raw' (no kiosk resolution, no display metadata) and pagination support. However, it does not explain the return format or any potential limitations, leaving some ambiguity for a tool that lists raw objects.

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 concise, front-loaded sentences. The first sentence states the core function; the second gives alternative guidance. No filler or redundancy.

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?

The tool has no output schema, so return values are not documented. While the description clearly covers primary purpose and when to use alternatives, it leaves the exact structure of a 'raw object' response unspecified. Given the schema covers all parameters and the alternatives are well-stated, the description is mostly complete but not fully.

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 the schema fully documents all 5 parameters. The description merely mentions 'optional type filter and pagination', adding no new meaning beyond what the schema already provides.

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 clearly it lists raw Sui objects owned by an address, with optional type filter and pagination. It distinguishes itself from sibling tools by explicitly contrasting with list_nfts and get_wallet_overview.

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?

Provides explicit when-to-use guidance by directing NFT queries to list_nfts and wallet summaries to get_wallet_overview. This clearly maps scenarios to the right tool.

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

query_transactionsA

Query raw Sui transactions with specific filters (sender, affected address/object, function, checkpoint range). Note: only ONE of affected_address, affected_object, or function can be used per query (Sui GraphQL limitation). For human-readable wallet activity, prefer get_transaction_history instead.

ATTRIBUTION WARNING: the function filter matches any transaction containing that call, including PTBs where it is one leg among several protocols. A transaction's balance changes cover the WHOLE PTB, so summing them per protocol over-attributes — a big Cetus swap in the same PTB will be counted as your protocol's volume. Set include_functions to see every Move call in each transaction, and prefer the protocol's own events (query_events) when measuring per-protocol flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
afterNoPagination cursor
limitNoMax results (default 20)
senderNoFilter by sender address
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).
functionNoFilter by Move function (e.g. 0x2::coin::transfer or 0x2::pay). Mutually exclusive with affected_address and affected_object.
affected_objectNoFilter by affected object ID. Mutually exclusive with affected_address and function.
affected_addressNoFilter by affected address (sender, sponsor, or recipient). Mutually exclusive with affected_object and function.
after_checkpointNoOnly transactions after this checkpoint
before_checkpointNoOnly transactions before this checkpoint
include_functionsNoReturn every Move call in each transaction, so you can see whether the filtered package was the whole transaction or one leg of a multi-protocol PTB.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries full responsibility for behavioral disclosure. It reveals the Sui GraphQL limitation (only one of affected_address, affected_object, or function may be used), explains the PTB attribution pitfall, and describes how include_functions mitigates it. This is high-value behavioral context beyond the schema.

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

Conciseness4/5

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

The description is long but structured into a purpose/guidance section and a warning paragraph. Each sentence earns its place, though the attribution warning is dense. It is appropriately detailed for a complex tool with 10 parameters but not perfectly concise.

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 10-parameter tool with no output schema and no annotations, the description covers the most important contextual concerns: filter exclusivity, PTB attribution, and alternative tools. It stops short of describing the return shape or pagination behavior, but the raw transaction intent is clear enough for an agent to invoke it correctly.

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, but the description enhances the meaning of tricky parameters: it explains why function filtering is dangerous for attribution and when to use include_functions. However, most parameter details are left to the schema, so the gain is modest but non-trivial.

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 'Query raw Sui transactions with specific filters' and enumerates the filter types (sender, affected address/object, function, checkpoint range), making the tool's scope immediately clear. It also distinguishes itself from the sibling tool get_transaction_history by labeling itself 'raw' and explicitly directing human-readable queries to that sibling.

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?

The description gives explicit when-to-use guidance: 'For human-readable wallet activity, prefer get_transaction_history instead' and warns against using the function filter for per-protocol volume metrics, suggesting query_events as the alternative. It also states the mutual-exclusivity constraint among three filters, which is a crucial usage rule.

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

resolve_nameA

Resolve a SuiNS name (.sui domain) to an address, or reverse-lookup an address to its SuiNS name. At least one of 'name' or 'address' must be provided.

IDENTITY WARNING: a SuiNS name is a self-chosen handle that anyone can buy. It is not identity and it is not verified. Names matching an exchange, a project or a person can be — and are — registered by unrelated parties, including by someone who wants an investigator to draw a particular conclusion. Treat a name as a label the holder picked, never as evidence of who they are, and do not carry it to other platforms as a matching key without independent corroboration.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSuiNS name to resolve (e.g. 'example.sui')
addressNoAddress to reverse-lookup to a SuiNS name
networkNoWhich Sui network to run this call against: 'mainnet' (default), 'testnet', or 'devnet'. Set this per-call — different tool calls in the same session can target different networks (e.g. to compare a value on testnet against mainnet).

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden, and it does well by adding a substantial identity warning: SuiNS names are self-chosen, unverified, and potentially misleading. It does not detail response format, error behavior, or explicit read-only status, but for a lookup tool the main behavioral risks are addressed.

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

Conciseness4/5

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

The functional description is front-loaded and unambiguous, and the identity warning is long but substantive in an investigative context. No sentences are wasted, though the warning could be slightly tightened.

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

Completeness3/5

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

The key constraint is stated and the lookup behavior is clear, but with no output schema the agent is left without return-shape or failure-mode information. It also does not specify what happens when both name and address are supplied, which is a plausible edge case.

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?

The schema already documents all three parameters, so the baseline is 3, but the description adds the critical at-least-one requirement and clarifies that name and address are opposite directions of the same lookup. It also gives a concrete .sui example and the identity warning adds meaning to the name parameter.

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 opening sentence states the exact operation: resolving a SuiNS name to an address and reverse-looking-up an address to a name. It is specific, anchored to the .sui namespace, and clearly distinct from sibling tools like identify_address or get_object.

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

Usage Guidelines2/5

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

The description does not explain when to prefer this tool over alternatives, nor does it name any sibling tool or exclusion condition. The 'at least one of name or address' sentence is an invocation constraint rather than usage guidance.

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. 3 tool updatesv1.12.1
    • Changedenable_tools4 fields changed
      • changedInput schema / properties / profile / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "core",
        -      "forensics",
        -      "developer",
        -      "market"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "const": "all",
        -    "type": "string"
        -  }
        -]New value: +[
        +  {
        +    "anyOf": [
        +      {
        +        "enum": [
        +          "core",
        +          "forensics",
        +          "developer",
        +          "market"
        +        ],
        +        "type": "string"
        +      },
        +      {
        +        "const": "all",
        +        "type": "string"
        +      }
        +    ]
        +  },
        +  {
        +    "items": {
        +      "$ref": "#/properties/profile/anyOf/0"
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / profile / description
        Previous value: -"Profile to enable, or 'all'."New value: +"Profile to enable, or 'all'. Accepts several: ['forensics','developer']."
      • addedInput schema / properties / profiles
        Added value: +{
        +  "$ref": "#/properties/profile",
        +  "description": "Alias for `profile`. Same values; use whichever reads better."
        +}
      • removedInput schema / required
        Removed value: -[
        -  "profile"
        -]
    • Changedget_transaction1 field changed
      • addedInput schema / properties / max_event_field_bytes
        Added value: +{
        +  "description": "Optional byte cap on decoded event fields. UNSET BY DEFAULT: every event comes back with its fields, because an investigation must not be silently working from a subset. Set this only when you knowingly want to bound the payload — anything skipped is reported — or set 0 to skip decoding entirely.",
        +  "maximum": 500000,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Addedget_transactions
  2. 18 tool updatesv1.5.0
    • First observedanalyze_token
    • First observedenable_tools
    • First observedfind_pools
    • First observedget_balance
    • First observedget_chain_info
    • First observedget_defi_positions
    • First observedget_object
    • First observedget_staking_summary
    • First observedget_token_prices
    • First observedget_transaction
    • First observedget_transaction_history
    • First observedget_wallet_overview
    • First observedidentify_address
    • First observedlist_nft_collections
    • First observedlist_nfts
    • First observedlist_owned_objects
    • First observedquery_transactions
    • First observedresolve_name

TDQS

A3.9/5.0

Scored across 19 tools

Disambiguation3/5

The tool surface has overlapping tools for similar purposes: get_transaction vs get_transactions vs query_transactions vs get_transaction_history; get_object vs list_owned_objects vs list_nfts; find_pools vs get_pool_stats vs search_token. However, descriptions provide enough hints (e.g., raw vs decoded, count-only) to reduce confusion, though an agent may still pick the wrong one.

Naming Consistency4/5

Most tools follow a consistent verb_noun pattern (get_, list_, resolve_, find_, analyze_, build_, etc.) with clear object names. A few deviations like 'mvr_resolve' and 'disassemble_module' (no 'get') and the profile names 'enable_tools' are acceptable, but overall the pattern is predictable.

Tool Count2/5

With 19 tools listed, the surface is already sizeable, but the server expects dynamic loading of additional tools (e.g., 'all' profile) which could push the true count to over 100. This feels overwhelming and excessive for a single server. The default 19 is borderline, but the full capability scope is too broad.

Completeness5/5

The tool set covers a comprehensive range of Sui operations: address identification, wallet overview, balances, transactions (raw and decoded), NFTs, DeFi, staking, token analysis, price data, pool discovery, name resolution, chain info, and historical queries. The coverage is thorough, and the descriptions include cross-tool guidance (e.g., get_balance vs staking) that prevents dead ends. The forensics and developer profiles add more depth, making the surface effectively complete for the domain.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    F
    maintenance
    An MCP server for the Sui blockchain that enables AI agents to manage accounts, execute token swaps, and perform smart contract development using the Sui CLI. It supports over 30 tools for DeFi operations, staking, and market data via Pyth price oracles.
    10 npm
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server providing tools for Sui blockchain interaction, including wallet management and Move smart contract development. It enables users to build, test, and publish contracts, query on-chain objects, and execute transactions through Claude.
    14
    5 npm
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Comprehensive MCP server for the Sui blockchain with 53 tools covering wallets, DeFi (Cetus, DeepBook), SuiNS, staking, validators, Move introspection, and full RPC. Enables natural language interaction with the entire Sui ecosystem.
    53
    30 npm
    1
    MIT