Skip to main content
Glama

TWZRD Agent Intelligence

is_wash_fleet

Read-onlyIdempotent
Free discovery: cheap circular-flow (wash) check for a payer wallet.

Returns the CATEGORICAL classification (clean / self_pay / reciprocal /
self+reciprocal), an is_circular bool, and the observed event counts +
distinct_merchants from the wallet's corpus edges. Use as a fast Sybil/wash
gate before trusting a counterparty.

Accepts a Solana public key or a Base/EVM address. On Base the signal reads
the high-confidence x402 rollup only, and the 3-cycle ring runs as a live
query instead of the Solana precomputed matview. Read ring_evaluated: when it
is false, ring_events=0 means NOT EVALUATED, never "no rings observed".

Fail-open: a DB gap returns classification "unknown". The numeric wash discount
(wash_factor / wash_ratio) and the full renormalized model stay paid — they are
NOT returned here.

Input Schema

NameRequiredDescriptionDefault
walletYesWallet to check for circular-flow / wash behavior: a Solana public key (32-44 base58 chars) or a Base/EVM address (0x + 40 hex).

Output Schema

NameRequiredDescriptionDefault
chainNoWhich corpus answered: "solana" or "base". Base reads the high-confidence x402 rollup only.
errorNoPresent only on the degraded path.
reasonNoDegraded-path reason, if any.
walletNoThe wallet checked.
is_circularNoTrue if any self-pay or reciprocal (2-cycle) flow was observed.
ring_eventsNoEvents forming a 3-cycle ring. Meaningless unless ring_evaluated is true: 0 with ring_evaluated false means NOT LOOKED FOR, not none found.
self_eventsNoEvents where the wallet paid itself.
total_eventsNoTotal observed payment events.
classificationNoCircular-flow class: "clean" | "self_pay" | "reciprocal" | "self+reciprocal" | "unknown".
ring_evaluatedNoTrue only when the ring axis actually ran for this wallet: the precomputed Solana ring aggregate was read, or the live Base 3-cycle query returned. False when the ring lookup failed or the Solana wallet has no aggregate row yet - in both of which ring_events=0 means not evaluated, never none found.
reciprocal_eventsNoEvents forming a 2-cycle (counterparty also pays this wallet).
distinct_merchantsNoDistinct merchants this wallet paid.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / ring_evaluated / description
      Previous value: -"True only when the precomputed Solana ring aggregate was actually read for this wallet. False on Base (no ring matview), when the ring lookup failed, or when the wallet has no aggregate row yet - in all of which ring_events=0 means not evaluated, never none found."New value: +"True only when the ring axis actually ran for this wallet: the precomputed Solana ring aggregate was read, or the live Base 3-cycle query returned. False when the ring lookup failed or the Solana wallet has no aggregate row yet - in both of which ring_events=0 means not evaluated, never none found."
  2. Changed1 schema field changed
    • changedOutput schema / properties / ring_evaluated / description
      Previous value: -"Whether 3-cycle ring detection ran. True on Solana (precomputed matview); false on Base, where no such matview exists."New value: +"True only when the precomputed Solana ring aggregate was actually read for this wallet. False on Base (no ring matview), when the ring lookup failed, or when the wallet has no aggregate row yet - in all of which ring_events=0 means not evaluated, never none found."
  3. Changed4 schema fields changed
    • changedInput schema / properties / wallet / description
      Previous value: -"Solana wallet public key (32-44 base58 chars) to check for circular-flow / wash behavior."New value: +"Wallet to check for circular-flow / wash behavior: a Solana public key (32-44 base58 chars) or a Base/EVM address (0x + 40 hex)."
    • addedOutput schema / properties / chain
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Which corpus answered: \"solana\" or \"base\". Base reads the high-confidence x402 rollup only.",
      +  "title": "Chain"
      +}
    • addedOutput schema / properties / ring_evaluated
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Whether 3-cycle ring detection ran. True on Solana (precomputed matview); false on Base, where no such matview exists.",
      +  "title": "Ring Evaluated"
      +}
    • addedOutput schema / properties / ring_events
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Events forming a 3-cycle ring. Meaningless unless ring_evaluated is true: 0 with ring_evaluated false means NOT LOOKED FOR, not none found.",
      +  "title": "Ring Events"
      +}
  4. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only cover safety (readOnlyHint, idempotentHint); the description goes well beyond them, disclosing fail-open semantics ('a DB gap returns classification "unknown"'), the Base-vs-Solana implementation difference, and the critical ring_evaluated=false pitfall where ring_events=0 means NOT EVALUATED. It also bounds what is returned, noting wash_factor/wash_ratio are withheld.

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

Conciseness4/5

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

Purpose is front-loaded in the first line and the remaining sentences are dense with unique operational facts rather than filler. Slightly fragmented across six short paragraphs, but no sentence is wasted.

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

Completeness5/5

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

Despite an output schema existing, the description supplies the interpretive context the schema cannot: the meaning of the four classifications, the fail-open 'unknown' case, and the ring_evaluated caveat. For a single-param gate tool with annotations covering safety, nothing needed for correct invocation is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents the wallet string as a Solana pubkey or Base/EVM address. The description's 'Accepts a Solana public key or a Base/EVM address' repeats that without adding format or precedence detail, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (circular-flow / wash check for a payer wallet) and scopes it as a 'free discovery' tool, which implicitly separates it from the paid scoring siblings. An agent can tell what it produces (a categorical classification plus counts) without opening the schema.

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

Usage Guidelines4/5

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

'Use as a fast Sybil/wash gate before trusting a counterparty' gives a concrete when-to-use condition. It implies a paid alternative exists ('the full renormalized model stay paid') but never names the sibling tool an agent should reach for instead, so routing is only partly resolved.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.