Skip to main content
Glama

Server Details

Dry-run Solana txs before agents sign: exact balance changes, intent match, token traps. 25 free/day

Ownership verified
Status
Healthy
Uptime
58.5% over 61 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
Timothymycompc/solana-pulse-ai-agent-gateway
GitHub Stars
0
ChatGPT
–
Claude
–

TDQS

A4/5.0

Scored across 18 tools

Disambiguation4/5

Most tools have explicit 'run when' triggers that separate them well (find_token for tickers vs whats_this for address types; why_failed for error strings vs explain_tx for confirmed transactions). Real overlap exists: wallet explicitly substitutes for balance + tokens + history, and check_tx, tx_matches, and build_tx all validate the same transaction (build_tx runs the other two internally). Descriptions resolve most of this, but an agent could plausibly pick the redundant aggregate tool over the specific ones.

Naming Consistency3/5

Casing is uniformly snake_case, but the pattern is mixed: some names are verb_noun (build_tx, check_tx, find_token, explain_tx, tx_matches, why_failed, whats_this) while others are bare nouns or fragments (balance, blockhash, fee, history, wallet, tokens, convert, trace). The names are readable but not predictable from one another.

Tool Count4/5

18 tools is on the heavy side, but the domain is genuinely broad: wallet reads, token safety, transaction building, simulation, verification, and error decoding each need their own surface. A few convenience overlaps (wallet vs balance/tokens/history) could be trimmed, keeping it slightly over-scoped rather than bloated.

Completeness4/5

Coverage of the stated safety-layer purpose is strong: pre-sign checking (check_tx, tx_matches, token_safety), building (build_tx), cost pricing (fee, blockhash), post-mortem (explain_tx, why_failed, trace), and identity/amount resolution (find_token, whats_this, convert, token_account). Gaps are minor and largely intentional: no signing/submission tool (by design) and no swap quote preview before build_tx.

Available Tools

18 tools
balanceA
Read-onlyIdempotent
Inspect

Run before sending SOL or paying fees, to confirm the wallet has enough. Never trust a remembered balance. A wallet's SOL balance, read from the chain. Example: {"wallet": ""}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/balance.

NameRequiredDescriptionDefault
walletYesThe wallet to read the SOL balance of. The user's address (from their wallet app) or your agent's public key. Not a .sol name or ticker.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive/openWorld, so the safety profile is settled. The description goes further by disclosing the cost model (25 free calls/day, then $0.01 USDC per call via x402) and a freshness discipline ('Never trust a remembered balance'), both of which are real behavioral context beyond the structured fields.

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?

Dense and waste-free: trigger, purpose, example, cost, and output pointer. The ordering is slightly inverted (usage precedes the statement of what the tool is), and the trailing 'Outputs explained: GET /api/tools/balance.' is an odd fragment, but nothing is padded.

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?

A two-parameter read tool with no nested objects and no output schema is well covered by trigger + purpose + example + cost. The only gap is return shape, which is gestured at via a docs URL rather than described, so an agent knows what to pass but not exactly what comes back.

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 documents both `wallet` and `network` (including the .sol-name exclusion and the devnet warning). The description only adds the inline example {"wallet": "<address>"}, which is marginal; baseline 3 is correct when the 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?

States a specific verb and resource: 'A wallet's SOL balance, read from the chain.' The 'SOL' qualifier implicitly separates it from sibling token-balance tools (tokens, token_account, find_token), so an agent can route correctly without opening schemas. No tautology, no vagueness.

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?

Gives a strong prescriptive trigger ('Run before sending SOL or paying fees, to confirm the wallet has enough. Never trust a remembered balance.'), which is exactly the when-to-use context an agent needs. It lacks an explicit when-not or a named alternative sibling, so it falls just short of the top band.

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

blockhashA
Read-onlyIdempotent
Inspect

Run just before building a transaction to sign. Blockhashes expire in about 60-90 seconds; this says how long is left. A fresh blockhash and how many blocks (and about how many seconds) are left before it expires. Example: {}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/blockhash.

NameRequiredDescriptionDefault
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds genuinely new context the annotations cannot carry: the ~60-90 second expiry window, the metered cost (25 free calls/day, then $0.01 USDC per call via x402), and where output semantics are documented. The cost/rate-limit disclosure is particularly valuable and would otherwise be invisible.

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 operative instruction and the time-sensitivity constraint are front-loaded in the first two sentences, followed by output expectations and cost. Most sentences earn their place, though 'Example: {}.' is filler that conveys nothing and slightly dilutes the structure.

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?

There is no output schema, so the description bears the return-value burden and does describe the payload (a fresh blockhash, blocks remaining, approximate seconds remaining). Combined with the cost and expiry context, an agent has enough to call this correctly; the pointer to external docs for 'outputs explained' is a minor reliance on off-tool documentation.

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 single 'network' parameter already documents its enum, default, and the real-money vs test-wallet distinction. The description says nothing about the network parameter and adds no syntax or default information beyond the schema. Baseline 3 is appropriate when the schema carries the whole load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: it returns a fresh blockhash plus the blocks and seconds remaining before expiry. That is clearly distinct from every sibling (balance, check_tx, fee, tokens, etc.), none of which deal with blockhashes. It is only slightly muddied by leading with an imperative ('Run just before building a transaction to sign') rather than naming the artifact first.

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?

It gives an explicit trigger condition ('Run just before building a transaction to sign') and quantifies the operative constraint ('expire in about 60-90 seconds'), which tells the agent precisely when this call is and isn't worth making. No alternative tool is named, but no sibling performs this function, so there is nothing to route away to.

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

build_txA
Read-onlyIdempotent
Inspect

Run when an agent needs to send SOL or a token, or swap through Jupiter: it returns the unsigned transaction already checked, with ready_to_sign and the reasons. Sign only when ready_to_sign is true. Builds a SOL or token transfer, or a Jupiter swap, as an unsigned transaction with a fresh blockhash and a fair priority fee, then runs check_tx and tx_matches on it (and token_safety on a token being bought). Never signs or sends. Example: {"action": "transfer", "from": "", "to": "", "token": "SOL", "amount": "0.01"}. Cost: 25 free calls a day, then $0.03 USDC per call (x402). Outputs explained: GET /api/tools/build_tx.

NameRequiredDescriptionDefault
toNoTransfers: who receives it. From the request. Check it with whats_this first if it came from someone else.
buyNoSwaps: the token to buy. find_token gives the mint.
fromYesThe wallet that pays and will sign. The agent's or user's own wallet address.
tokenNoThe token to send (transfer) or to sell (swap). Default "SOL". find_token turns a name like USDC into its mint address. Never guess a mint.SOL
actionYesSend a token to someone, or swap one token for another through Jupiter. From the request.
amountYesHow much of token, in whole tokens: "1.5" means 1.5 USDC, not raw units. From the request.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta
allow_avoidNoSwaps: build even when token_safety says AVOID for the token being bought. Default false. Only when the user has read the AVOID reasons and still wants it.
slippage_bpsNoSwaps: the most the price may move against you, in basis points (50 = 0.5%). Default 50, at most 300. Leave the default unless the token is thinly traded.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already mark it read-only and non-destructive, but the description adds substantial behavioral context: it returns an unsigned transaction with fresh blockhash and priority fee, runs check_tx/tx_matches/token_safety, exposes readiness and reasons, and has free-tier plus per-call pricing.

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 important trigger and safety condition are front-loaded, and every sentence carries useful information. It is dense and semicolon-heavy, but not wasteful.

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 complex transaction-building tool with no output schema, the description covers the full behavioral contract: unsigned output, ready_to_sign gating, internal checks, token safety behavior, signing prohibition, and cost. An agent has enough context to invoke and interpret 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 schema already fully documents the nine parameters. The description adds an example call, but otherwise does not add much parameter syntax or format detail 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 states a specific verb and resource: it builds a SOL/token transfer or Jupiter swap as an unsigned transaction. It also distinguishes this from sibling tools by saying it runs check_tx, tx_matches, and token_safety internally.

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?

It gives a clear trigger: use when an agent needs to send SOL or a token, or swap through Jupiter. It also states the key gating condition: sign only when ready_to_sign is true, and never signs or sends itself.

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

check_txA
Read-onlyIdempotent
Inspect

Run on every transaction before signing. Shows what each wallet gains and loses, blocks drainer tricks, and catches failures and expired blockhashes before you pay a fee. Decodes each step, dry-runs it on live mainnet, finds each wallet's SOL and token changes, and answers OK, REVIEW or BLOCK with reasons. Measured: no false BLOCK on 200 real mainnet transactions; with tx_matches it caught 9 of 9 attack cases (benchmark/ in the repo). Example: {"tx": "<base64, before signing>"}. Cost: 25 free calls a day, then $0.02 USDC per call (x402). Outputs explained: GET /api/tools/check_tx.

NameRequiredDescriptionDefault
txYesBase64 transaction, signed or not, legacy, v0 or v1. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world behavior, and the description adds substantial context beyond them: live-mainnet dry-run, verdict semantics with reasons, measured false-positive rate, and a concrete pricing/rate limit (25 free calls/day, then $0.02 USDC via x402). No claim conflicts with the annotations.

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 usage imperative is front-loaded, followed by capability, evidence, example, and cost in a logical order. It is slightly dense with promotional asides ('benchmark/ in the repo', 'Outputs explained: GET /api/tools/check_tx'), but nearly every sentence carries actionable information.

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

Completeness5/5

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

With no output schema, the description fully covers return behavior by enumerating the OK/REVIEW/BLOCK verdict with reasons. Combined with cost, network scope, and a worked example, nothing an agent needs to call this correctly is missing.

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% and already documents both parameters thoroughly, so the baseline is 3. The description reinforces the critical semantics with an example showing tx as base64 'before signing', which clarifies the parameter's intended state beyond the schema wording.

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 action and object ('dry-runs' each step, decodes transactions, returns OK/REVIEW/BLOCK verdicts) and frames its unique scope as a pre-signing safety check. That behavior is clearly distinct from siblings like explain_tx, why_failed, and tx_matches, which it complements rather than duplicates.

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?

'Run on every transaction before signing' gives an explicit trigger condition, and the mention of tx_matches' 9-of-9 catch rate implies the complement rather than a substitute. It does not explicitly name when to prefer explain_tx or why_failed, so the exclusions are left implicit.

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

convertA
Read-onlyIdempotent
Inspect

Run before putting any token amount in a transaction. "5 USDC" is 5,000,000 raw units; wrong decimals send 1,000x too much or too little. Converts between normal amounts and raw units with the token's real on-chain decimals. Example: {"token": "SOL", "amount": "0.5"} gives 500000000. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/convert.

NameRequiredDescriptionDefault
toNoDirection. "raw" turns 5 into 5000000 (for transactions); "readable" turns raw units back. Default "raw". "readable" for amounts read from chain data.raw
tokenYesThe token, or "SOL" for SOL (9 decimals). From find_token or tokens.
amountYesThe amount, as a string: "5" or "0.25". The user's amount. A string avoids rounding errors.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds genuinely new operational context: rate limits ('25 free calls a day') and a paid fallback ('$0.01 USDC per call (x402)'), which an agent must know before calling in a loop.

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?

Front-loads the trigger ('Run before...') and the failure mode before details, then packs example, cost, and doc pointer. Dense but nearly every sentence earns its place; the trailing 'Outputs explained: GET /api/tools/convert' is a bare pointer rather than prose.

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?

No output schema exists, but the description partially compensates with a concrete output example and a doc pointer for output details. Combined with full schema coverage, an agent has enough to call it correctly, though return-shape specifics remain external.

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 adds real interpretive value beyond the schema: a worked example ('{"token": "SOL", "amount": "0.5"} gives 500000000') and the concrete 5 USDC = 5,000,000 raw units mapping that clarifies the raw/readable direction.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Converts between normal amounts and raw units with the token's real on-chain decimals') and frames the concrete risk it addresses ('wrong decimals send 1,000x too much or too little'). An agent can distinguish this from siblings like find_token or balance without opening a schema.

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?

Gives an explicit when: 'Run before putting any token amount in a transaction,' plus direction guidance implying readable mode for chain-read amounts. It doesn't name an alternative tool or state when NOT to use it, but the triggering context is unambiguous.

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

explain_txA
Read-onlyIdempotent
Inspect

Run after a transaction lands or fails, to report what happened instead of guessing from logs. For failures it names the failing program and the fix. Reads a confirmed transaction: whether it worked, the fee, each wallet's SOL and token changes, the programs used, and why it failed. Example: {"tx_id": ""}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/explain_tx.

NameRequiredDescriptionDefault
tx_idYesThe transaction's signature. Returned when you send, or from history. Never make one up.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), and the description adds real value on top: it confirms it reads a confirmed transaction and discloses cost/rate limits ('25 free calls a day, then $0.01 USDC per call (x402)'). That pricing detail is exactly the kind of context an agent needs and annotations cannot convey.

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?

Front-loads the key trigger and purpose, then adds outputs, an example, cost, and a doc pointer. Mostly efficient, though 'For failures it names the failing program and the fix' and 'why it failed' are somewhat redundant.

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 tool with fully documented params and no output schema, the definition covers purpose, trigger, return contents, cost, and a doc link. It is essentially complete, with only the sibling-relationship gap as a minor shortfall.

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 coverage is 100%, so the schema already documents tx_id and network thoroughly (including the enum and 'never make one up'). The description only restates this with an example, adding little beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: it explains a confirmed transaction, reporting outcome, fee, SOL/token changes, programs used, and failure reason. This is clearly distinguishable from generic readers, but it never names siblings like check_tx or why_failed, whose purpose appears to overlap with the 'why it failed' part.

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?

Gives an explicit trigger: 'Run after a transaction lands or fails... instead of guessing from logs.' That establishes when to reach for it. It stops short of stating when-not to use it or naming an alternative such as check_tx or why_failed.

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

feeA
Read-onlyIdempotent
Inspect

Run before setting a priority fee. Gives the price in the unit Compute Budget expects (micro-lamports per compute unit) and the total in SOL, so a unit mix-up never overpays. Turns what recent transactions paid for priority into three prices: cheap, normal, fast. Pass your transaction to get its compute limit and exact cost at each. Example: {} for network prices, or {"tx": ""} for your own. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/fee.

NameRequiredDescriptionDefault
txNoYour transaction, so fees match its accounts and compute comes from a dry run. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world, so the bar is lower — yet the description adds real context: exact pricing (25 free calls/day, then $0.01 USDC per call via x402), the unit-conversion guarantee, and a dry-run implication when a tx is supplied. It also points to where outputs are explained, which preempts the missing output 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?

Front-loaded with the trigger, then the payoff, then usage modes and cost. Dense but each sentence carries signal; the trailing 'Outputs explained: GET /api/tools/fee' is slightly awkward as prose but still informative.

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?

Two optional parameters, no output schema, and the description covers return shape (three price tiers, units, SOL total), cost/rate limits, and the optional-tx behavior. Nothing an agent needs in order to call it correctly is missing.

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; the description earns above that by explaining the zero-argument mode ({} returns network-wide prices) and by clarifying that supplying tx yields the compute limit plus exact cost at each tier — the 'why' behind the parameter, not just its format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource: it computes a Solana priority fee, returning three tiers (cheap/normal/fast) plus compute-limit-aware costs. The unit detail ('micro-lamports per compute unit' and total in SOL) makes it unmistakable versus siblings like convert or 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?

'Run before setting a priority fee' gives an explicit trigger, and the description distinguishes the two invocation modes ({} for network prices vs {"tx": ...} for your own transaction). It does not name sibling alternatives or say when another tool would be preferable, which keeps it out of 5 territory.

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

find_tokenA
Read-onlyIdempotent
Inspect

Run whenever a user names a token ("buy BONK"). Tickers aren't unique; copycats reuse them. Never take an address from memory. Finds the real address for a ticker or name, ranks matches by verification and liquidity, and warns when copycats share the ticker. Example: {"name": "BONK"}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/find_token.

NameRequiredDescriptionDefault
nameYesTicker, name or address: "BONK", "Jupiter", "USDC". Exactly as the user wrote it.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavior the annotations cannot convey: ranked-by-verification-and-liquidity results, copycat warnings, the x402 cost model with 25 free calls/day then $0.01 USDC per call, and a pointer to the output documentation. Rate/cost disclosure is exactly the kind of context annotations miss.

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?

Front-loaded with the trigger condition and packs cost, ranking, and warning behavior into a short block. The trailing 'Outputs explained: GET /api/tools/find_token' is a slightly awkward fragment, and the embedded JSON example is marginally redundant, but overall no wasted sentences.

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 one-parameter, read-only lookup with no output schema, the description covers trigger, parameters, ranking semantics, edge cases (copycats), cost, and even points to where outputs are documented. Nothing material is missing 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?

Schema coverage is 100% and the schema already documents the 'name' parameter thoroughly, including the 'exactly as the user wrote it' guidance. The inline example {"name": "BONK"} restates what the schema already shows rather than adding new semantics, so the 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?

States a specific verb and resource ('finds the real address for a ticker or name'), plus the ranking behavior and copycat warning. This is clearly distinguishable from siblings like token_safety, tokens, and balance, which an agent can tell apart without opening any schema.

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

Usage Guidelines5/5

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

Explicit trigger ('Run whenever a user names a token'), an explicit anti-pattern ('Never take an address from memory'), and the reason copycats make this necessary. The agent knows exactly when to reach for this tool and why shortcuts are dangerous.

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

historyA
Read-onlyIdempotent
Inspect

Run to see a wallet's recent activity or get a real transaction ID. Never make one up. Lists a wallet's latest transactions, newest first, whether each worked, and a plain error name for failures. Example: {"wallet": "", "how_many": 5}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/history.

NameRequiredDescriptionDefault
beforeNoStart below this transaction, to page further back. next_before from the previous answer.
walletYesThe wallet to read the transactions of. The user's address (from their wallet app) or your agent's public key. Not a .sol name or ticker.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta
how_manyNoHow many transactions to return. Default 10.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already mark this read-only, idempotent and non-destructive; the description adds genuinely new context: newest-first ordering, per-transaction success status, plain-name error reporting, and a concrete cost model (25 free calls/day, then $0.01 USDC per call via x402). Pagination behavior is left entirely to the `before` schema field and the return payload is deferred to an external URL rather than described.

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

Conciseness3/5

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

The lead sentence is well front-loaded, but the second and third sentences overlap ("recent activity" vs. "latest transactions") and the trailing "Outputs explained: GET /api/tools/history" is a cryptic endpoint reference of questionable value to an agent. Editing would tighten it without losing 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?

For a 4-parameter read tool with full schema coverage and no output schema, the description covers purpose, ordering, success/error reporting, and cost, which is enough to call it correctly. The one real gap is what the next-page cursor looks like on return, which is only hinted at 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?

Schema description coverage is 100%, so every parameter including `before`, `network` and `how_many` is already documented in structured fields. The description only restates this via an example payload ({"wallet": "<address>", "how_many": 5}), which aids invocation but adds no semantics beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a concrete verb and resource: it "lists a wallet's latest transactions, newest first," and adds that it can also surface a real transaction ID. It implicitly steers the agent away from fabricating IDs for downstream tools, but it never names a specific sibling like check_tx or explain_tx to draw the boundary crisply.

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?

"Run to see a wallet's recent activity or get a real transaction ID. Never make one up" gives a clear triggering condition and an important prohibition on invented IDs. It does not spell out when to prefer this over check_tx, explain_tx, or tx_matches, so the exclusion is only implied.

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

token_accountA
Read-onlyIdempotent
Inspect

Run before sending a token. Tokens go to the recipient's token account, not their wallet, and models can't work that address out. Finds the token account (ATA) for a wallet and token with the token's real program, says if it exists, and prices creating it. Example: {"wallet": "", "token": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"} finds where their USDC goes. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/token_account.

NameRequiredDescriptionDefault
tokenYesThe token's address. From find_token or tokens. Not a ticker.
walletYesThe wallet that will own it (usually the recipient). The recipient's wallet address.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.3/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description still adds valuable non-schema behavior: it says it reports existence and prices account creation, and discloses the paywall (25 free calls/day then $0.01 USDC via x402) — a real constraint the agent cannot see in annotations.

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?

Dense but front-loaded: the imperative 'Run before sending a token' and the ATA explanation come first, then example, then cost. The trailing 'Outputs explained: GET /api/tools/token_account' is slightly awkward and reads like a docs pointer rather than a sentence, but nothing is wasted.

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?

There is no output schema, and the description compensates by stating what the call reports (existence and creation cost), plus the routing rationale and pricing. It points to an external endpoint for output details instead of describing return shape inline, which is a minor gap for a read tool with no output schema.

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 would be 3. The description earns above baseline by reinforcing the non-obvious semantic that wallet is the owner/recipient and token must be an address rather than a ticker, plus a worked example showing a USDC lookup end to end.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Finds the token account (ATA) for a wallet and token with the token's real program, says if it exists, and prices creating it.' It also distinguishes itself from siblings by naming find_token and tokens as the source of the token address, so an agent knows where token_account sits in the flow.

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?

Gives explicit when-to-use guidance ('Run before sending a token') and explains the underlying reason tokens go to an ATA, not the wallet. It stops short of naming when NOT to use it or listing a sibling alternative for the same job, but the trigger condition is unambiguous.

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

tokensA
Read-onlyIdempotent
Inspect

Run to learn which tokens a wallet holds and how much. Ranked by USD value; unverified (often spam airdrop) tokens are flagged so you don't report fake holdings. Lists a wallet's tokens (SPL Token and Token-2022) with exact amounts, whether each is verified, and USD value where priced. Example: {"wallet": "", "how_many": 10}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/tokens.

NameRequiredDescriptionDefault
walletYesThe wallet to read the tokens of. The user's address (from their wallet app) or your agent's public key. Not a .sol name or ticker.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta
how_manyNoHow many tokens, highest USD value first, to return. Default 25.
include_emptyNoInclude empty token accounts. True only to find empty accounts, e.g. to close them.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/openWorld, but the description adds genuinely non-obvious behavior: spam/unverified airdrops are flagged so the agent doesn't report fake holdings, results are USD-ranked, and there is a metered cost (25 free calls/day then $0.01 USDC via x402). It stops short of pagination or rate-limit behavior.

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?

Front-loaded with the core purpose and mostly efficient, but the opening 'learn which tokens a wallet holds and how much' is immediately restated in the third sentence about listing tokens with amounts and values — one sentence of redundancy in an otherwise tight block.

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?

No output schema exists, so the description must carry return-value context; it names the returned fields (amount, verified, USD value) and points to an external explanation page. That covers the essentials, though it doesn't fully describe the response shape or headline values.

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 every parameter (wallet, network, how_many, include_empty) is already well documented in the schema. The description's example ({"wallet": ..., "how_many": 10}) restates rather than adds meaning, so this sits at the baseline 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?

States a concrete verb+resource ('lists a wallet's tokens') and pins down scope: SPL Token and Token-2022, exact amounts, verification status, USD value, ranked highest-value-first. That is enough to distinguish it from balance, token_account, find_token, and token_safety without opening any schema.

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

Usage Guidelines3/5

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

Usage is implied by 'Run to learn which tokens a wallet holds and how much,' and it hints at when to set include_empty ('only to find empty accounts, e.g. to close them'), but it never names an alternative sibling or states when NOT to use this tool (e.g. for a single token's safety, use token_safety). No explicit routing guidance.

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

token_safetyA
Read-onlyIdempotent
Inspect

Run before buying, accepting or recommending a token. Answers SAFE, CAUTION or AVOID with exact reasons from chain and market data, plus rug_chance (high, with reasons, or null). Simulates a real holder selling, then checks if liquidity can be pulled, the creator's record, insider wallet networks, issuer powers (mint, freeze, Token-2022 traps), verification, liquidity, holders and age, for one verdict. Example: {"token": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"} checks BONK. Cost: 25 free calls a day, then $0.02 USDC per call (x402). Outputs explained: GET /api/tools/token_safety.

NameRequiredDescriptionDefault
tokenYesThe token's address. From find_token (for a ticker) or tokens (for a wallet's tokens).
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.3/5.0
Behavior5/5

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

Goes well past the readOnly/idempotent annotations by disclosing cost mechanics (25 free calls/day, then $0.02 USDC via x402), the simulation behavior (a real holder sell to test liquidity pull), and the exact verdict/rug_chance output shape. For a paid, open-world external call, these are precisely the traits an agent needs before invoking.

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?

Front-loaded with the trigger and the output vocabulary, then evidence, then an example, then cost — a sensible priority order with little redundancy. The trailing "Outputs explained: GET /api/tools/token_safety" is cryptic (a URL fragment rather than a sentence) and the middle clause listing checks is dense, but nothing is wasted.

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?

With no output schema, the description still names the verdict enum, the rug_chance semantics (high with reasons, or null), and the cost model, which is enough to decide and call. The full output payload is deferred to an external docs path, leaving the agent to infer field-level detail.

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 coverage is 100%, so both parameters are already documented, including the mainnet-beta vs devnet distinction. The description adds a worked example showing the token address format, but says nothing about the network parameter or what an invalid/unknown token returns — marginal lift over 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?

States a specific action (safety-check a token) and a concrete, enumerated return (SAFE / CAUTION / AVOID plus rug_chance), and lists the exact signals checked (liquidity pull, creator record, insider wallets, mint/freeze powers, Token-2022 traps). This is unmistakably distinct from siblings like find_token or tokens, which only resolve addresses.

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?

"Run before buying, accepting or recommending a token" gives a clear triggering condition, and the parameter description routes the agent to find_token/tokens first to obtain the address. It stops short of naming a when-not case or an alternative verdict tool, but the usage context is unambiguous.

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

traceA
Read-onlyIdempotent
Inspect

Run when a wallet was drained or money went missing, or before trusting an address someone gave you: follows the money and flags sweeper, pass-through and lookalike-address patterns. Follows a wallet's money through its recent transactions: net SOL and token change and the other side of each, where most money went, and drain patterns with evidence. Example: {"wallet": "", "how_many": 25}. Cost: 25 free calls a day, then $0.02 USDC per call (x402). Outputs explained: GET /api/tools/trace.

NameRequiredDescriptionDefault
beforeNoStart below this transaction, to page further back. next_before from the previous answer.
walletYesThe wallet to follow. The user's wallet, or an address from their report. Never make one up.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta
how_manyNoHow many recent transactions to read, newest first (1-50, default 25). More covers a longer stretch of time.
time_zoneNoThe person's time zone, so the report shows their clock time next to UTC, e.g. America/Chicago. Ask them, or leave it out for UTC only.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover read-only, non-destructive, idempotent, open-world behavior, so the bar is lower. The description still adds valuable beyond-schema context: pricing (25 free calls/day then $0.02 USDC via x402) and a pointer to output docs. It stops short of 5 by not detailing rate-limit failure modes or result size beyond the paging param.

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?

Front-loads the trigger conditions and then the mechanics, which is good ordering. There is minor redundancy between 'follows the money' and 'Follows a wallet's money through its recent transactions', but overall it is dense with little waste.

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?

No output schema exists, but the description compensates with a concrete example, pricing, and a pointer to the output documentation, plus an explicit enumeration of what is returned. Enough for an agent to invoke correctly, though the output-docs pointer is off-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%, so the schema already documents all five parameters including the paging cursor and time zone. The description only adds a sample invocation ({wallet, how_many}) and does not deepen parameter meaning, which is the correct baseline expectation.

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?

Names a specific verb and resource — follows a wallet's money through its recent transactions — and lists distinguishing outputs (net SOL/token change, counterparties, where most money went, drain patterns with evidence). This clearly separates it from generic siblings like history or wallet.

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?

Gives explicit triggering conditions: 'when a wallet was drained or money went missing, or before trusting an address someone gave you.' It does not name an alternative sibling (e.g. why use this over history or token_safety), so it stops short of 5.

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

tx_matchesA
Read-onlyIdempotent
Inspect

Run just before signing a transfer built from a request like "send 5 USDC to X", or a swap built for "swap 1 USDC for JUP". Confirms it moves exactly that token, amount and recipient, nothing more, or that the swap sells exactly that amount and pays the bought token back to you. Catches made-up amounts, wrong decimals, hidden steps and swaps that pay someone else. Compares the transaction with your request (token, exact amount, recipient, sender), flags every step that isn't the transfer, and checks dry-run balances so money moved any other way is caught. For a swap it reads the dry run: exactly the amount sold, the bought token reaching your wallet, and nothing else leaving it. Measured on 200 real mainnet transactions: 80 of 80 transfers and 26 of 27 swaps matched (the other paid a bot 1.54%). Example: "send 1 USDC to X" is {"tx": "", "expected": {"token": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "amount": "1", "to": "X"}}. Cost: 25 free calls a day, then $0.02 USDC per call (x402). Outputs explained: GET /api/tools/tx_matches.

NameRequiredDescriptionDefault
txYesBase64 transaction, signed or not, legacy, v0 or v1. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta
expectedYesaction: Default "transfer". "swap" takes sell, amount, buy and from instead of token, amount and to. From the request you were given. token: The token to send. "SOL", or the token address from find_token. amount: Normal units (for a swap: the amount sold): "5" means 5 USDC. The user's amount, as a string. to: The person's wallet, not their token account. The address the user gave you. Never take it from the transaction. from: The wallet that pays (for a swap: sells and gets the bought token). Default: the fee payer. Your agent's wallet address. sell: Swaps only: the token sold. "SOL", or the token address from find_token. buy: Swaps only: the token bought. "SOL", or the token address from find_token. Never take it from the transaction.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover the safety profile, and the description adds real beyond-schema context: cost (25 free calls/day then $0.02 via x402), dry-run balance checking, step flagging, and accuracy stats on 200 mainnet transactions. This is exactly the kind of operational detail the annotations don't carry.

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

Conciseness3/5

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

It is front-loaded with the trigger ('Run just before signing'), but the middle is dense and repetitive (re-explaining amount/recipient matching several times) and packs in benchmark stats plus a cost/URL line. Every element is defensible, but the result is longer than needed and could be tightened.

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 verify-before-signing tool with no output schema, the description covers inputs, semantics, cost and the kinds of findings returned, and points to a docs URL for output format. The return shape itself isn't concretely specified, keeping it from a 5.

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 parameters are already documented; the description still adds value with a concrete worked example and the critical guidance 'Never take [to/from] the transaction' for expected.to. The distinction between transfer and swap field sets is conveyed, though partly by the schema itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action (verify a transfer/swap transaction matches the user's request before signing) with a precisely defined resource and scope. An agent can distinguish it from siblings like check_tx, explain_tx and why_failed because the description frames it as intent-matching against an 'expected' spec.

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?

'Run just before signing a transfer... or a swap' gives an explicit timing/trigger condition and the failure modes it protects against. It does not explicitly name sibling alternatives or when-not-to-use, so it falls short of a 5.

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

tx_versionA
Read-onlyIdempotent
Inspect

Run when code can't find or read a transaction that is on chain, or before relying on code that reads other people's transactions. Says whether a transaction is legacy, version 0 or version 1, and which readers (RPC settings and library versions) can read it. Example: {"tx_id": ""} or {"tx": ""}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/tx_version.

NameRequiredDescriptionDefault
txNoA raw transaction, signed or not. Give this or tx_id. The bytes a wallet or builder gave you, base64-encoded.
tx_idNoA landed transaction's signature. Give this or tx. Returned when it was sent, or from history. Never make one up.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses the pricing/authorization model: 25 free calls per day, then $0.01 USDC per call via x402. That is the kind of thing an agent cannot get from structured fields and needs before calling.

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?

Front-loads the trigger condition, then the result, then examples and cost — a sensible ordering with little waste. The closing 'Outputs explained: GET /api/tools/tx_version' is a slightly awkward pointer but short.

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?

With no output schema, the description still tells the agent what the answer contains (version classification and compatible readers) and notes cost/auth. Minor gap: it defers output detail to an external URL instead of stating the response shape, and doesn't explain network-specific differences.

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; the description adds call-shape examples showing the tx vs tx_id alternatives in concrete form. It adds modest value over the schema's existing 'Give this or tx_id' wording rather than deep semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it reports whether a transaction is legacy, version 0, or version 1, and which readers can decode it. That is easily separable from siblings like check_tx, explain_tx, and why_failed, which diagnose status rather than transaction format/version compatibility.

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?

Gives explicit triggering conditions: when code can't find or read an on-chain transaction, or before relying on code that reads other people's transactions. It doesn't name a sibling alternative directly, so the exclusion boundary is inferred rather than stated.

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

walletA
Read-onlyIdempotent
Inspect

Run when asked what a wallet holds or is worth. One call instead of balance + tokens + history; spam is left out of the total. SOL balance, top tokens with USD values, estimated total, and recent activity in one answer. Example: {"wallet": ""}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/wallet.

NameRequiredDescriptionDefault
walletYesThe wallet to sum up. The user's wallet address.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, open-world, non-destructive, so safety is covered. The description adds genuinely new behavioral facts: spam tokens are excluded from the total, the call is a paid x402 endpoint with a free-tier quota, and it aggregates four result categories into one answer.

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 trigger condition is front-loaded in the first sentence, followed by the differentiator, the payload summary, an example, and pricing. Every sentence carries distinct information with no filler.

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?

No output schema exists, but the description enumerates what comes back (SOL balance, top tokens with USD values, estimated total, recent activity) and points to the documented output spec, so an agent knows both how to call it and roughly what to expect. Nothing material is missing for a 2-param read tool.

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 both params are already documented, giving a baseline of 3. The description adds an inline invocation example ({"wallet": "<address>"}) that shows the call shape, but says nothing about the network enum's mainnet/devnet tradeoff beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('what a wallet holds or is worth') and explicitly positions itself against siblings: 'One call instead of balance + tokens + history.' An agent can distinguish it from balance, tokens, and history without opening any schema.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('Run when asked what a wallet holds or is worth') and names the three sibling tools it replaces, which is exactly the routing decision an agent faces. Cost/rate-limit context (25 free calls/day, then $0.01 USDC via x402) further informs when to prefer this over multiple cheaper calls.

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

whats_thisA
Read-onlyIdempotent
Inspect

Run when unsure what an address is, before sending to it or passing it on. SOL sent to a token or program address can be lost for good. Says what any address is (wallet, token account, token, program, stake account and more) with its key facts. Example: {"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"} is the USDC token, not a wallet. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/whats_this.

NameRequiredDescriptionDefault
addressYesAny Solana address. The address you're about to use.
networkNoDefault "mainnet-beta" (real money). "devnet" only for test wallets.mainnet-beta

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), and the description goes well beyond them by disclosing cost and throttling ('25 free calls a day, then $0.01 USDC per call (x402)') plus the real-world consequence of misuse. This is exactly the contextual layer annotations cannot express.

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?

Front-loads the trigger condition and the risk of misuse before capability, example and cost. Dense but every clause carries weight; the trailing 'Outputs explained: GET /api/tools/whats_this' is the weakest element, reading more like a doc link than guidance.

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?

With no output schema, the description still conveys the shape of the return ('what any address is... with its key facts') and points to an explanation endpoint for the rest. That is adequate for a single-address lookup, though the returned fields themselves are never enumerated.

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 coverage is 100%, so both the address and network parameters (including the mainnet-beta default and devnet caveat) are already fully documented in the schema. The description's USDC example illustrates what the address might be rather than adding format or syntax detail, so the schema remains the primary source.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and broad resource: identifies what any address is ('wallet, token account, token, program, stake account and more') with key facts. It implicitly subsumes single-purpose siblings like wallet, find_token and token_account, but never names them, so the agent must infer the routing decision itself.

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?

Gives a clear triggering condition ('run when unsure what an address is, before sending to it or passing it on') and a concrete consequence that motivates it (SOL sent to a token or program address can be lost for good). Strong when-to-use, but no explicit when-not-to-use or named alternative tools.

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

why_failedA
Read-onlyIdempotent
Inspect

Run whenever a Solana transaction or dry run fails, before retrying. Retrying blind burns fees. Turns a Solana error (hex code, log line or RPC error) into the plain cause and fix. Offline, no chain call. Example: {"error": "custom program error: 0x1771", "program": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"}. Cost: 25 free calls a day, then $0.01 USDC per call (x402). Outputs explained: GET /api/tools/why_failed.

NameRequiredDescriptionDefault
errorYesThe error as you got it: "custom program error: 0x1771", "InsufficientFundsForRent", or the RPC error object. From your send or RPC error, a dry-run result, a wallet message, or history.
programNoThe failing program. Needed to read custom error codes right. From the log line "Program <address> failed", or from explain_tx.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld. The description adds genuine extra context beyond them: it runs offline with no chain call, and discloses the cost model (25 free calls/day, then $0.01 USDC per call via x402). It does not describe the return shape, but the cost and offline behavior are material facts.

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?

Front-loaded with the trigger and the value proposition, followed by cost and a concrete example. Dense but every sentence carries signal, aside from the slightly cryptic closing "Outputs explained: GET /api/tools/why_failed."

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?

With no output schema, the description compensates reasonably by explaining it maps errors to a cause and fix, discloses cost and offline behavior, and gives a worked example. It is complete enough to call correctly, though the return format remains unspecified.

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 both parameters are already fully documented in the schema. The inline example (error 0x1771 plus the JUP6 program address) illustrates the expected shape, which is marginally helpful, but the description adds little beyond what the schema provides. Baseline 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?

States a specific verb+resource: it turns a Solana error (hex code, log line or RPC error) into the plain cause and fix. This clearly distinguishes it from siblings like explain_tx or check_tx, which analyze transactions rather than diagnose error codes.

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?

"Run whenever a Solana transaction or dry run fails, before retrying" gives an explicit trigger condition and timing (before retry). It does not name a specific alternative tool, so it falls short of full when-not/alternatives 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. 2 tool updates
    • Addedbuild_tx
    • Addedtx_version
  2. 1 tool update
    • Changedtrace1 field changed
      • addedInput schema / properties / time_zone
        Added value: +{
        +  "description": "The person's time zone, so the report shows their clock time next to UTC, e.g. America/Chicago. Ask them, or leave it out for UTC only.",
        +  "maxLength": 64,
        +  "type": "string"
        +}
  3. 2 tool updates
    • Changedhistory1 field changed
      • addedInput schema / properties / before
        Added value: +{
        +  "description": "Start below this transaction, to page further back. next_before from the previous answer.",
        +  "maxLength": 100,
        +  "minLength": 64,
        +  "type": "string"
        +}
    • Addedtrace
  4. 1 tool update
    • Changedtx_matches5 fields changed
      • addedInput schema / properties / expected / anyOf
        Added value: +[
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "swap",
        +        "type": "string"
        +      },
        +      "amount": {
        +        "type": "string"
        +      },
        +      "buy": {
        +        "type": "string"
        +      },
        +      "from": {
        +        "type": "string"
        +      },
        +      "sell": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "action",
        +      "sell",
        +      "amount",
        +      "buy"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "action": {
        +        "const": "transfer",
        +        "type": "string"
        +      },
        +      "amount": {
        +        "type": "string"
        +      },
        +      "from": {
        +        "type": "string"
        +      },
        +      "to": {
        +        "type": "string"
        +      },
        +      "token": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "token",
        +      "amount",
        +      "to"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedInput schema / properties / expected / description
        Previous value: -"token: The token to send. \"SOL\", or the token address from find_token. amount: Normal units: \"5\" means 5 USDC. The user's amount, as a string. to: The person's wallet, not their token account. The address the user gave you. Never take it from the transaction. from: The wallet that pays. Default: the fee payer. Your agent's wallet address."New value: +"action: Default \"transfer\". \"swap\" takes sell, amount, buy and from instead of token, amount and to. From the request you were given. token: The token to send. \"SOL\", or the token address from find_token. amount: Normal units (for a swap: the amount sold): \"5\" means 5 USDC. The user's amount, as a string. to: The person's wallet, not their token account. The address the user gave you. Never take it from the transaction. from: The wallet that pays (for a swap: sells and gets the bought token). Default: the fee payer. Your agent's wallet address. sell: Swaps only: the token sold. \"SOL\", or the token address from find_token. buy: Swaps only: the token bought. \"SOL\", or the token address from find_token. Never take it from the transaction."
      • removedInput schema / properties / expected / properties
        Removed value: -{
        -  "action": {
        -    "const": "transfer",
        -    "type": "string"
        -  },
        -  "amount": {
        -    "type": "string"
        -  },
        -  "from": {
        -    "type": "string"
        -  },
        -  "to": {
        -    "type": "string"
        -  },
        -  "token": {
        -    "type": "string"
        -  }
        -}
      • removedInput schema / properties / expected / required
        Removed value: -[
        -  "token",
        -  "amount",
        -  "to"
        -]
      • removedInput schema / properties / expected / type
        Removed value: -"object"
  5. 2 tool updates
    • Changedcheck_tx1 field changed
      • changedInput schema / properties / tx / description
        Previous value: -"Base64 transaction, signed or not, legacy or v0. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx."New value: +"Base64 transaction, signed or not, legacy, v0 or v1. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx."
    • Changedtx_matches1 field changed
      • changedInput schema / properties / tx / description
        Previous value: -"Base64 transaction, signed or not, legacy or v0. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx."New value: +"Base64 transaction, signed or not, legacy, v0 or v1. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx."
  6. 15 tool updates
    • Changedbalance2 fields changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / wallet / description
        Previous value: -"The wallet address to read the SOL balance of. The user's wallet address (from their wallet app, or your agent's own public key). Not a .sol name or a ticker."New value: +"The wallet to read the SOL balance of. The user's address (from their wallet app) or your agent's public key. Not a .sol name or ticker."
    • Changedblockhash1 field changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
    • Changedcheck_tx2 fields changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / tx / description
        Previous value: -"The transaction, base64-encoded. Signed or not. Legacy and v0 both work. From your wallet SDK before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'). Or the swap transaction an aggregator API gave you."New value: +"Base64 transaction, signed or not, legacy or v0. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx."
    • Changedconvert3 fields changed
      • changedInput schema / properties / amount / description
        Previous value: -"The amount to convert, as a string, e.g. \"5\" or \"0.25\". The amount the user asked for. A string avoids rounding errors."New value: +"The amount, as a string: \"5\" or \"0.25\". The user's amount. A string avoids rounding errors."
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / to / description
        Previous value: -"Which way to convert. \"raw\" turns 5 into 5000000 (for transactions). \"readable\" turns raw units back into a normal amount. Default \"raw\". \"raw\" before building a transaction, \"readable\" when reading raw amounts."New value: +"Direction. \"raw\" turns 5 into 5000000 (for transactions); \"readable\" turns raw units back. Default \"raw\". \"readable\" for amounts read from chain data."
    • Changedexplain_tx2 fields changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / tx_id / description
        Previous value: -"The transaction's ID (its signature). You get it back when you send a transaction, or from history. Never make one up."New value: +"The transaction's signature. Returned when you send, or from history. Never make one up."
    • Changedfee2 fields changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / tx / description
        Previous value: -"Optional. Your transaction, so fees are measured on the accounts it writes to and compute is measured by a dry run. From your wallet SDK before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'). Or the swap transaction an aggregator API gave you."New value: +"Your transaction, so fees match its accounts and compute comes from a dry run. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx."
    • Changedfind_token1 field changed
      • changedInput schema / properties / name / description
        Previous value: -"The token's ticker, name or address, e.g. \"BONK\", \"Jupiter\", \"USDC\". The token name exactly as the user wrote it."New value: +"Ticker, name or address: \"BONK\", \"Jupiter\", \"USDC\". Exactly as the user wrote it."
    • Changedhistory3 fields changed
      • changedInput schema / properties / how_many / description
        Previous value: -"How many transactions to return. Default 10. Leave it out for 10."New value: +"How many transactions to return. Default 10."
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / wallet / description
        Previous value: -"The wallet address to read the transactions of. The user's wallet address (from their wallet app, or your agent's own public key). Not a .sol name or a ticker."New value: +"The wallet to read the transactions of. The user's address (from their wallet app) or your agent's public key. Not a .sol name or ticker."
    • Changedtoken_account2 fields changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / wallet / description
        Previous value: -"The wallet that will own the token account (usually the recipient). The recipient's wallet address."New value: +"The wallet that will own it (usually the recipient). The recipient's wallet address."
    • Changedtoken_safety2 fields changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / token / description
        Previous value: -"The token's address. From find_token (for a ticker) or tokens (for tokens a wallet holds)."New value: +"The token's address. From find_token (for a ticker) or tokens (for a wallet's tokens)."
    • Changedtokens4 fields changed
      • changedInput schema / properties / how_many / description
        Previous value: -"How many tokens, highest USD value first, to return. Default 25. Leave it out for 25."New value: +"How many tokens, highest USD value first, to return. Default 25."
      • changedInput schema / properties / include_empty / description
        Previous value: -"Whether to include empty token accounts. Default false. Set true only to find empty accounts (for example to close them)."New value: +"Include empty token accounts. True only to find empty accounts, e.g. to close them."
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / wallet / description
        Previous value: -"The wallet address to read the tokens of. The user's wallet address (from their wallet app, or your agent's own public key). Not a .sol name or a ticker."New value: +"The wallet to read the tokens of. The user's address (from their wallet app) or your agent's public key. Not a .sol name or ticker."
    • Changedtx_matches3 fields changed
      • changedInput schema / properties / expected / description
        Previous value: -"token: The token that should be sent. amount: How much should be sent, in normal units. \"5\" means 5 USDC. to: The wallet that should get it (the person, not their token account). from: The wallet that should pay. Default: the transaction's fee payer."New value: +"token: The token to send. \"SOL\", or the token address from find_token. amount: Normal units: \"5\" means 5 USDC. The user's amount, as a string. to: The person's wallet, not their token account. The address the user gave you. Never take it from the transaction. from: The wallet that pays. Default: the fee payer. Your agent's wallet address."
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / tx / description
        Previous value: -"The transaction, base64-encoded. Signed or not. Legacy and v0 both work. From your wallet SDK before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'). Or the swap transaction an aggregator API gave you."New value: +"Base64 transaction, signed or not, legacy or v0. Before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'), or an aggregator's swap tx."
    • Changedwallet2 fields changed
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
      • changedInput schema / properties / wallet / description
        Previous value: -"The wallet address to sum up. The user's wallet address."New value: +"The wallet to sum up. The user's wallet address."
    • Changedwhats_this2 fields changed
      • changedInput schema / properties / address / description
        Previous value: -"Any Solana address. Whatever address you're about to use."New value: +"Any Solana address. The address you're about to use."
      • changedInput schema / properties / network / description
        Previous value: -"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."New value: +"Default \"mainnet-beta\" (real money). \"devnet\" only for test wallets."
    • Changedwhy_failed2 fields changed
      • changedInput schema / properties / error / description
        Previous value: -"The error exactly as you got it: \"custom program error: 0x1771\", \"InsufficientFundsForRent\", or the RPC error object. From your send or RPC error, a dry-run result, a wallet message, or history."New value: +"The error as you got it: \"custom program error: 0x1771\", \"InsufficientFundsForRent\", or the RPC error object. From your send or RPC error, a dry-run result, a wallet message, or history."
      • changedInput schema / properties / program / description
        Previous value: -"The program that failed. Needed to read custom error codes correctly. From the log line \"Program <address> failed\", or from explain_tx."New value: +"The failing program. Needed to read custom error codes right. From the log line \"Program <address> failed\", or from explain_tx."
  7. 15 tool updates
    • Changedbalance2 fields changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / wallet / description
        Added value: +"The wallet address to read the SOL balance of. The user's wallet address (from their wallet app, or your agent's own public key). Not a .sol name or a ticker."
    • Changedblockhash1 field changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
    • Changedcheck_tx2 fields changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / tx / description
        Added value: +"The transaction, base64-encoded. Signed or not. Legacy and v0 both work. From your wallet SDK before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'). Or the swap transaction an aggregator API gave you."
    • Changedconvert4 fields changed
      • addedInput schema / properties / amount / description
        Added value: +"The amount to convert, as a string, e.g. \"5\" or \"0.25\". The amount the user asked for. A string avoids rounding errors."
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / to / description
        Added value: +"Which way to convert. \"raw\" turns 5 into 5000000 (for transactions). \"readable\" turns raw units back into a normal amount. Default \"raw\". \"raw\" before building a transaction, \"readable\" when reading raw amounts."
      • addedInput schema / properties / token / description
        Added value: +"The token, or \"SOL\" for SOL (9 decimals). From find_token or tokens."
    • Changedexplain_tx2 fields changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / tx_id / description
        Added value: +"The transaction's ID (its signature). You get it back when you send a transaction, or from history. Never make one up."
    • Changedfee2 fields changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / tx / description
        Added value: +"Optional. Your transaction, so fees are measured on the accounts it writes to and compute is measured by a dry run. From your wallet SDK before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'). Or the swap transaction an aggregator API gave you."
    • Changedfind_token1 field changed
      • addedInput schema / properties / name / description
        Added value: +"The token's ticker, name or address, e.g. \"BONK\", \"Jupiter\", \"USDC\". The token name exactly as the user wrote it."
    • Changedhistory3 fields changed
      • addedInput schema / properties / how_many / description
        Added value: +"How many transactions to return. Default 10. Leave it out for 10."
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / wallet / description
        Added value: +"The wallet address to read the transactions of. The user's wallet address (from their wallet app, or your agent's own public key). Not a .sol name or a ticker."
    • Changedtoken_account3 fields changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / token / description
        Added value: +"The token's address. From find_token or tokens. Not a ticker."
      • addedInput schema / properties / wallet / description
        Added value: +"The wallet that will own the token account (usually the recipient). The recipient's wallet address."
    • Changedtoken_safety2 fields changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / token / description
        Added value: +"The token's address. From find_token (for a ticker) or tokens (for tokens a wallet holds)."
    • Changedtokens4 fields changed
      • addedInput schema / properties / how_many / description
        Added value: +"How many tokens, highest USD value first, to return. Default 25. Leave it out for 25."
      • addedInput schema / properties / include_empty / description
        Added value: +"Whether to include empty token accounts. Default false. Set true only to find empty accounts (for example to close them)."
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / wallet / description
        Added value: +"The wallet address to read the tokens of. The user's wallet address (from their wallet app, or your agent's own public key). Not a .sol name or a ticker."
    • Changedtx_matches3 fields changed
      • addedInput schema / properties / expected / description
        Added value: +"token: The token that should be sent. amount: How much should be sent, in normal units. \"5\" means 5 USDC. to: The wallet that should get it (the person, not their token account). from: The wallet that should pay. Default: the transaction's fee payer."
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / tx / description
        Added value: +"The transaction, base64-encoded. Signed or not. Legacy and v0 both work. From your wallet SDK before signing: Buffer.from(tx.serialize({ requireAllSignatures: false })).toString('base64'). Or the swap transaction an aggregator API gave you."
    • Changedwallet2 fields changed
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
      • addedInput schema / properties / wallet / description
        Added value: +"The wallet address to sum up. The user's wallet address."
    • Changedwhats_this2 fields changed
      • addedInput schema / properties / address / description
        Added value: +"Any Solana address. Whatever address you're about to use."
      • addedInput schema / properties / network / description
        Added value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
    • Changedwhy_failed2 fields changed
      • addedInput schema / properties / error / description
        Added value: +"The error exactly as you got it: \"custom program error: 0x1771\", \"InsufficientFundsForRent\", or the RPC error object. From your send or RPC error, a dry-run result, a wallet message, or history."
      • addedInput schema / properties / program / description
        Added value: +"The program that failed. Needed to read custom error codes correctly. From the log line \"Program <address> failed\", or from explain_tx."
  8. 30 tool updates
    • Addedbalance
    • Addedblockhash
    • Removedcheck_transaction_intent
    • Addedcheck_tx
    • Addedconvert
    • Removedconvert_amount
    • Removedexplain_error
    • Removedexplain_transaction
    • Addedexplain_tx
    • Addedfee
    • Removedfee_advice
    • Removedfind_ata
    • Addedfind_token
    • Removedget_recent_transactions
    • Removedget_solana_balance
    • Removedget_solana_blockhash
    • Removedget_token_accounts
    • Addedhistory
    • Removedinspect_address
    • Removedpreflight_transaction
    • Removedresolve_token
    • Addedtoken_account
    • Addedtoken_safety
    • Removedtoken_verdict
    • Addedtokens
    • Addedtx_matches
    • Addedwallet
    • Removedwallet_snapshot
    • Addedwhats_this
    • Addedwhy_failed
  9. 29 tool updates
    • Removedanalyze_token_concentration
    • Removedanalyze_wallet_portfolio
    • Addedcheck_transaction_intent
    • Removedcompare_tokens
    • Addedconvert_amount
    • Removeddecode_tx
    • Removedestimate_transaction_cost
    • Addedexplain_error
    • Addedexplain_transaction
    • Removedexplain_transaction_effects
    • Addedfee_advice
    • Changedfind_ata3 fields changed
      • removedInput schema / properties / mint / description
        Removed value: -"Token mint address: base58, 32-44 characters (required). Example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v is USDC."
      • removedInput schema / properties / network / description
        Removed value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional."
      • removedInput schema / properties / wallet / description
        Removed value: -"Owner of the token account: a regular wallet address (base58 public key, 32-44 characters), not a program-derived address (required)."
    • Changedget_recent_transactions4 fields changed
      • removedInput schema / properties / limit / description
        Removed value: -"How many signatures to return, newest first: integer 1-1000 (optional, default 10)."
      • changedInput schema / properties / limit / maximum
        Previous value: -1000New value: +50
      • removedInput schema / properties / network / description
        Removed value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional."
      • removedInput schema / properties / wallet / description
        Removed value: -"Wallet whose transaction history to list: base58 public key, 32-44 characters (required)."
    • Changedget_solana_balance2 fields changed
      • removedInput schema / properties / network / description
        Removed value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional."
      • removedInput schema / properties / wallet / description
        Removed value: -"Wallet whose SOL balance to read: base58 public key, 32-44 characters (required)."
    • Changedget_solana_blockhash1 field changed
      • removedInput schema / properties / network / description
        Removed value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional."
    • Changedget_token_accounts4 fields changed
      • addedInput schema / properties / includeZero
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 25,
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / network / description
        Removed value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional."
      • removedInput schema / properties / wallet / description
        Removed value: -"Wallet whose token accounts to list: base58 public key, 32-44 characters (required)."
    • Removedget_token_market_snapshot
    • Removedget_wallet_snapshot
    • Changedinspect_address4 fields changed
      • removedInput schema / properties / address / description
        Removed value: -"Any Solana address in Base58 format: wallet, program, mint, or token account."
      • removedInput schema / properties / address / maxLength
        Removed value: -44
      • removedInput schema / properties / address / minLength
        Removed value: -32
      • removedInput schema / properties / network / description
        Removed value: -"Solana cluster to query. Use mainnet-beta for real assets or devnet for test data; defaults to mainnet-beta."
    • Removedoptimal_fee
    • Addedpreflight_transaction
    • Addedresolve_token
    • Removedresolve_token_symbol
    • Removedsimulate_solana_transaction
    • Removedsummarize_wallet_activity
    • Removedtoken_profile
    • Addedtoken_verdict
    • Removedvalidate_transaction
    • Addedwallet_snapshot

Publisher details

Operator
timothymycompc@gmail.com
Vendor relationship
First-party
Documentation
Not available
Trust center
Not available
Restrictions
25 free calls a day then x402 for 1 or 2 cents per call

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    On-chain Solana token safety for trading agents — traces coordinated wallet funding, same-block Jito bundles, serial-rug deployers and live coordinated dumps into one Exit-Liquidity Risk verdict before a swap. Free tier, then $0.02 USDC/query via x402.
    1
    53 npm
    2
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Non-custodial agent wallet with a transaction preflight that decodes an unsigned EVM tx and flags drain patterns (unlimited/large approval, approve-all, token & NFT transferFrom, proxy upgrade, on-chain permit, approvals hidden in multicall) before signing.
    9
    85 PyPI
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Per-transaction crypto trade validator for AI agents, validates trades with PROCEED/CAUTION/BLOCK verdicts, scans tokens for anomalies, detects rug pulls, and searches across DEXes. Powered by WaveGuard physics engine with deterministic PDE-based analysis.
    5
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables AI agents to query Solana balances, SPL and Token-2022 holdings, transaction summaries, and recent activity, and to dry-run SOL transfers through read-only tools. It validates inputs and never signs or broadcasts transactions.
    5
    181 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.