Sui Mcp
Read-only Sui analytics: 68 tools, protocol-aware tx decoding, no API keys or wallet.
- Transport
- Not stated
- Package
- —
- Registry id
- io.github.0xfreak0/sui-mcp
No install snippet on purpose. A working MCP config is a command, its arguments and an environment block — the last two are where API keys live, so this catalogue never stores them and cannot publish them. Follow the link above for the authors' own instructions.
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.
68 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" }
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 is fixed by the address, 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]
From the project's README.