Solana Pulse: agent safety layer
Server Details
Dry-run Solana txs before agents sign: exact balance changes, intent match, token traps. 25 free/day
- 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
Scored across 18 tools
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.
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.
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.
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 toolsbalanceARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | 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. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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.
blockhashARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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_txARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Transfers: who receives it. From the request. Check it with whats_this first if it came from someone else. | |
| buy | No | Swaps: the token to buy. find_token gives the mint. | |
| from | Yes | The wallet that pays and will sign. The agent's or user's own wallet address. | |
| token | No | The 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 |
| action | Yes | Send a token to someone, or swap one token for another through Jupiter. From the request. | |
| amount | Yes | How much of token, in whole tokens: "1.5" means 1.5 USDC, not raw units. From the request. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
| allow_avoid | No | Swaps: 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_bps | No | Swaps: 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
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.
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.
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.
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.
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.
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_txARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tx | Yes | 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. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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.
convertARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Direction. "raw" turns 5 into 5000000 (for transactions); "readable" turns raw units back. Default "raw". "readable" for amounts read from chain data. | raw |
| token | Yes | The token, or "SOL" for SOL (9 decimals). From find_token or tokens. | |
| amount | Yes | The amount, as a string: "5" or "0.25". The user's amount. A string avoids rounding errors. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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_txARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tx_id | Yes | The transaction's signature. Returned when you send, or from history. Never make one up. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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.
feeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tx | No | 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. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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_tokenARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Ticker, name or address: "BONK", "Jupiter", "USDC". Exactly as the user wrote it. |
TDQS
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.
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.
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.
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.
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.
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.
historyARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| before | No | Start below this transaction, to page further back. next_before from the previous answer. | |
| wallet | Yes | 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. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
| how_many | No | How many transactions to return. Default 10. |
TDQS
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.
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.
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.
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.
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.
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_accountARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The token's address. From find_token or tokens. Not a ticker. | |
| wallet | Yes | The wallet that will own it (usually the recipient). The recipient's wallet address. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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.
tokensARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | 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. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
| how_many | No | How many tokens, highest USD value first, to return. Default 25. | |
| include_empty | No | Include empty token accounts. True only to find empty accounts, e.g. to close them. |
TDQS
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.
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.
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.
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.
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.
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_safetyARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The token's address. From find_token (for a ticker) or tokens (for a wallet's tokens). | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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.
traceARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| before | No | Start below this transaction, to page further back. next_before from the previous answer. | |
| wallet | Yes | The wallet to follow. The user's wallet, or an address from their report. Never make one up. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
| how_many | No | How many recent transactions to read, newest first (1-50, default 25). More covers a longer stretch of time. | |
| time_zone | No | 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. |
TDQS
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.
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.
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.
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.
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.
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_matchesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tx | Yes | 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. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
| expected | Yes | 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. |
TDQS
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.
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.
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.
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.
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.
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_versionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tx | No | A raw transaction, signed or not. Give this or tx_id. The bytes a wallet or builder gave you, base64-encoded. | |
| tx_id | No | A landed transaction's signature. Give this or tx. Returned when it was sent, or from history. Never make one up. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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.
walletARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| wallet | Yes | The wallet to sum up. The user's wallet address. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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_thisARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Any Solana address. The address you're about to use. | |
| network | No | Default "mainnet-beta" (real money). "devnet" only for test wallets. | mainnet-beta |
TDQS
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.
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.
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.
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.
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.
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_failedARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| error | Yes | 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. | |
| program | No | The failing program. Needed to read custom error codes right. From the log line "Program <address> failed", or from explain_tx. |
TDQS
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.
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.
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.
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.
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.
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.
2 tool updates
- Added
build_tx - Added
tx_version
1 tool update
- Changed
trace1 field changed- added
Input schema / properties / time_zoneAdded 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" +}
2 tool updates
- Changed
history1 field changed- added
Input schema / properties / beforeAdded value: +{ + "description": "Start below this transaction, to page further back. next_before from the previous answer.", + "maxLength": 100, + "minLength": 64, + "type": "string" +}
- Added
trace
1 tool update
- Changed
tx_matches5 fields changed- added
Input schema / properties / expected / anyOfAdded 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" + } +] - changed
Input schema / properties / expected / descriptionPrevious 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." - removed
Input schema / properties / expected / propertiesRemoved value: -{ - "action": { - "const": "transfer", - "type": "string" - }, - "amount": { - "type": "string" - }, - "from": { - "type": "string" - }, - "to": { - "type": "string" - }, - "token": { - "type": "string" - } -} - removed
Input schema / properties / expected / requiredRemoved value: -[ - "token", - "amount", - "to" -] - removed
Input schema / properties / expected / typeRemoved value: -"object"
2 tool updates
- Changed
check_tx1 field changed- changed
Input schema / properties / tx / descriptionPrevious 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."
- Changed
tx_matches1 field changed- changed
Input schema / properties / tx / descriptionPrevious 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."
15 tool updates
- Changed
balance2 fields changed- changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / wallet / descriptionPrevious 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."
- Changed
blockhash1 field changed- changed
Input schema / properties / network / descriptionPrevious 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."
- Changed
check_tx2 fields changed- changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / tx / descriptionPrevious 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."
- Changed
convert3 fields changed- changed
Input schema / properties / amount / descriptionPrevious 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." - changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / to / descriptionPrevious 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."
- Changed
explain_tx2 fields changed- changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / tx_id / descriptionPrevious 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."
- Changed
fee2 fields changed- changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / tx / descriptionPrevious 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."
- Changed
find_token1 field changed- changed
Input schema / properties / name / descriptionPrevious 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."
- Changed
history3 fields changed- changed
Input schema / properties / how_many / descriptionPrevious value: -"How many transactions to return. Default 10. Leave it out for 10."New value: +"How many transactions to return. Default 10." - changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / wallet / descriptionPrevious 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."
- Changed
token_account2 fields changed- changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / wallet / descriptionPrevious 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."
- Changed
token_safety2 fields changed- changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / token / descriptionPrevious 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)."
- Changed
tokens4 fields changed- changed
Input schema / properties / how_many / descriptionPrevious 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." - changed
Input schema / properties / include_empty / descriptionPrevious 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." - changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / wallet / descriptionPrevious 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."
- Changed
tx_matches3 fields changed- changed
Input schema / properties / expected / descriptionPrevious 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." - changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / tx / descriptionPrevious 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."
- Changed
wallet2 fields changed- changed
Input schema / properties / network / descriptionPrevious 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." - changed
Input schema / properties / wallet / descriptionPrevious value: -"The wallet address to sum up. The user's wallet address."New value: +"The wallet to sum up. The user's wallet address."
- Changed
whats_this2 fields changed- changed
Input schema / properties / address / descriptionPrevious value: -"Any Solana address. Whatever address you're about to use."New value: +"Any Solana address. The address you're about to use." - changed
Input schema / properties / network / descriptionPrevious 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."
- Changed
why_failed2 fields changed- changed
Input schema / properties / error / descriptionPrevious 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." - changed
Input schema / properties / program / descriptionPrevious 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."
15 tool updates
- Changed
balance2 fields changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / wallet / descriptionAdded 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."
- Changed
blockhash1 field changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
- Changed
check_tx2 fields changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / tx / descriptionAdded 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."
- Changed
convert4 fields changed- added
Input schema / properties / amount / descriptionAdded 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." - added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / to / descriptionAdded 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." - added
Input schema / properties / token / descriptionAdded value: +"The token, or \"SOL\" for SOL (9 decimals). From find_token or tokens."
- Changed
explain_tx2 fields changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / tx_id / descriptionAdded value: +"The transaction's ID (its signature). You get it back when you send a transaction, or from history. Never make one up."
- Changed
fee2 fields changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / tx / descriptionAdded 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."
- Changed
find_token1 field changed- added
Input schema / properties / name / descriptionAdded value: +"The token's ticker, name or address, e.g. \"BONK\", \"Jupiter\", \"USDC\". The token name exactly as the user wrote it."
- Changed
history3 fields changed- added
Input schema / properties / how_many / descriptionAdded value: +"How many transactions to return. Default 10. Leave it out for 10." - added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / wallet / descriptionAdded 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."
- Changed
token_account3 fields changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / token / descriptionAdded value: +"The token's address. From find_token or tokens. Not a ticker." - added
Input schema / properties / wallet / descriptionAdded value: +"The wallet that will own the token account (usually the recipient). The recipient's wallet address."
- Changed
token_safety2 fields changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / token / descriptionAdded value: +"The token's address. From find_token (for a ticker) or tokens (for tokens a wallet holds)."
- Changed
tokens4 fields changed- added
Input schema / properties / how_many / descriptionAdded value: +"How many tokens, highest USD value first, to return. Default 25. Leave it out for 25." - added
Input schema / properties / include_empty / descriptionAdded value: +"Whether to include empty token accounts. Default false. Set true only to find empty accounts (for example to close them)." - added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / wallet / descriptionAdded 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."
- Changed
tx_matches3 fields changed- added
Input schema / properties / expected / descriptionAdded 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." - added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / tx / descriptionAdded 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."
- Changed
wallet2 fields changed- added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets." - added
Input schema / properties / wallet / descriptionAdded value: +"The wallet address to sum up. The user's wallet address."
- Changed
whats_this2 fields changed- added
Input schema / properties / address / descriptionAdded value: +"Any Solana address. Whatever address you're about to use." - added
Input schema / properties / network / descriptionAdded value: +"Which Solana network to read. Default \"mainnet-beta\" (real money). Leave it out for mainnet. Use \"devnet\" only for test wallets."
- Changed
why_failed2 fields changed- added
Input schema / properties / error / descriptionAdded 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." - added
Input schema / properties / program / descriptionAdded value: +"The program that failed. Needed to read custom error codes correctly. From the log line \"Program <address> failed\", or from explain_tx."
30 tool updates
- Added
balance - Added
blockhash - Removed
check_transaction_intent - Added
check_tx - Added
convert - Removed
convert_amount - Removed
explain_error - Removed
explain_transaction - Added
explain_tx - Added
fee - Removed
fee_advice - Removed
find_ata - Added
find_token - Removed
get_recent_transactions - Removed
get_solana_balance - Removed
get_solana_blockhash - Removed
get_token_accounts - Added
history - Removed
inspect_address - Removed
preflight_transaction - Removed
resolve_token - Added
token_account - Added
token_safety - Removed
token_verdict - Added
tokens - Added
tx_matches - Added
wallet - Removed
wallet_snapshot - Added
whats_this - Added
why_failed
29 tool updates
- Removed
analyze_token_concentration - Removed
analyze_wallet_portfolio - Added
check_transaction_intent - Removed
compare_tokens - Added
convert_amount - Removed
decode_tx - Removed
estimate_transaction_cost - Added
explain_error - Added
explain_transaction - Removed
explain_transaction_effects - Added
fee_advice - Changed
find_ata3 fields changed- removed
Input schema / properties / mint / descriptionRemoved value: -"Token mint address: base58, 32-44 characters (required). Example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v is USDC." - removed
Input schema / properties / network / descriptionRemoved value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional." - removed
Input schema / properties / wallet / descriptionRemoved value: -"Owner of the token account: a regular wallet address (base58 public key, 32-44 characters), not a program-derived address (required)."
- Changed
get_recent_transactions4 fields changed- removed
Input schema / properties / limit / descriptionRemoved value: -"How many signatures to return, newest first: integer 1-1000 (optional, default 10)." - changed
Input schema / properties / limit / maximumPrevious value: -1000New value: +50 - removed
Input schema / properties / network / descriptionRemoved value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional." - removed
Input schema / properties / wallet / descriptionRemoved value: -"Wallet whose transaction history to list: base58 public key, 32-44 characters (required)."
- Changed
get_solana_balance2 fields changed- removed
Input schema / properties / network / descriptionRemoved value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional." - removed
Input schema / properties / wallet / descriptionRemoved value: -"Wallet whose SOL balance to read: base58 public key, 32-44 characters (required)."
- Changed
get_solana_blockhash1 field changed- removed
Input schema / properties / network / descriptionRemoved value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional."
- Changed
get_token_accounts4 fields changed- added
Input schema / properties / includeZeroAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 25, + "maximum": 100, + "minimum": 1, + "type": "integer" +} - removed
Input schema / properties / network / descriptionRemoved value: -"Cluster to query: \"mainnet-beta\" (real funds; the default) or \"devnet\" (test network). Optional." - removed
Input schema / properties / wallet / descriptionRemoved value: -"Wallet whose token accounts to list: base58 public key, 32-44 characters (required)."
- Removed
get_token_market_snapshot - Removed
get_wallet_snapshot - Changed
inspect_address4 fields changed- removed
Input schema / properties / address / descriptionRemoved value: -"Any Solana address in Base58 format: wallet, program, mint, or token account." - removed
Input schema / properties / address / maxLengthRemoved value: -44 - removed
Input schema / properties / address / minLengthRemoved value: -32 - removed
Input schema / properties / network / descriptionRemoved value: -"Solana cluster to query. Use mainnet-beta for real assets or devnet for test data; defaults to mainnet-beta."
- Removed
optimal_fee - Added
preflight_transaction - Added
resolve_token - Removed
resolve_token_symbol - Removed
simulate_solana_transaction - Removed
summarize_wallet_activity - Removed
token_profile - Added
token_verdict - Removed
validate_transaction - Added
wallet_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
Solana pre-trade safety for agents: rug check, honeypot sell-sim, drainer scan, tx preflight.
Pre-sign Solana tx guard for agents: ALLOW/WARN/BLOCK verdict, x402 USDC pay-per-call.
Solana pre-buy check, smart-money flow and imitation detection. Free tier; x402 pay-per-call.
Pre-trade token safety checks for AI agents on Solana and Base. x402 USDC per call, no key.
Related MCP Servers
- AlicenseAqualityCmaintenanceOn-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.153 npm2MIT
- AlicenseAqualityDmaintenanceNon-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.985 PyPI1MIT
- AlicenseAqualityDmaintenancePer-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.51MIT
- AlicenseAqualityDmaintenanceEnables 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.5181 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.