Skip to main content
Glama

PG1 Sovereign Threat Intelligence

check_wallet_age

PG1 Sovereign Threat Intelligence: reports when an EVM wallet address first appeared on a given chain, based on its earliest on-chain transfer history (in or out), plus whether the address is a contract. No payment required — this tool is always free. SIBLING DIFFERENTIATION: Use for wallet age/history only. Do NOT use for sanctions screening (use check_wallet_sanctions), domain age (use check_domain_age), or hostname/phishing reputation (use check_hostname_reputation). BEHAVIOR: Returns { address, chain, found, first_seen, age_days, first_seen_block, first_direction, is_contract, note, source: "on-chain transfer history", cached }. A found:false result (with all other fields null except is_contract) means the address has no transfer history on that chain — a normal, common result for a brand-new or never-used address, not an error, and not evidence of legitimacy either way; this tool reports age and history only. Upstream lookup failures or timeouts return an MCP tool error (isError: true) instead of found:false, since a data-source outage must never be read as "brand-new wallet". VALIDATION: address must be a 0x-prefixed 40-hex-character EVM address (case-insensitive); chain, if given, must be one of the supported enum values. Malformed input returns an MCP tool error (isError: true, code invalid_address or invalid_chain) instead of a result. Rate-limited to 60 calls/hour per caller when unauthenticated; a valid Gumroad license key (X-API-KEY header) exempts the limit, same as check_domain_age. A found result is cached permanently (it never changes); a found:false result is cached for 10 minutes only, since a wallet can become active at any time.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
chainNoOptional chain to check: 'base', 'ethereum', 'arbitrum', 'optimism', 'polygon', or 'bsc'. Defaults to 'base'.base
addressYesMandatory EVM wallet address to check, formatted '0x' followed by 40 hex characters (case-insensitive).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
noteNo
chainYes
foundYes
cachedYes
checksNoWhich underlying sources were checked for this result and whether each one completed.
sourceYes
statusNo"unknown" whenever a source needed for this answer timed out, errored, or was skipped - never "no_flags" in that case.
addressYesThe address, lowercased.
reasonsNoMachine-readable reason codes for anything flagged in this result. Empty when nothing was flagged.
age_daysYes
delegatedNotrue when the address currently has an EIP-7702 delegation on this chain (its code is exactly 0xef0100 followed by a 20-byte delegate address), false when it does not, null when the code check did not complete. Checked live on every call, never cached. is_contract is unchanged and is still true for a delegated address.
first_seenYesISO timestamp of the earliest observed transfer in or out, or null if none found.
request_idNoUUID for this request, also sent as the X-Request-Id response header.
is_contractYes
test_fixtureNotrue only when the input was a documented integration test fixture and this response is canned; absent on real results.
first_directionYes
delegate_addressNoThe lowercased delegate contract address when delegated is true, otherwise null.
first_seen_blockYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedOutput schema / properties / delegate_address
      Added value: +{
      +  "description": "The lowercased delegate contract address when delegated is true, otherwise null.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / delegated
      Added value: +{
      +  "description": "true when the address currently has an EIP-7702 delegation on this chain (its code is exactly 0xef0100 followed by a 20-byte delegate address), false when it does not, null when the code check did not complete. Checked live on every call, never cached. is_contract is unchanged and is still true for a delegated address.",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
  2. Changed5 schema fields changed
    • addedOutput schema / properties / checks
      Added value: +{
      +  "description": "Which underlying sources were checked for this result and whether each one completed.",
      +  "items": {
      +    "properties": {
      +      "checked_at": {
      +        "type": "string"
      +      },
      +      "data_as_of": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "result": {
      +        "enum": [
      +          "ok",
      +          "timeout",
      +          "error",
      +          "skipped"
      +        ],
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "Generic label for the data source checked, never a vendor name.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "source",
      +      "result",
      +      "checked_at",
      +      "data_as_of"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / reasons
      Added value: +{
      +  "description": "Machine-readable reason codes for anything flagged in this result. Empty when nothing was flagged.",
      +  "items": {
      +    "properties": {
      +      "code": {
      +        "type": "string"
      +      },
      +      "message": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "code",
      +      "message"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / request_id
      Added value: +{
      +  "description": "UUID for this request, also sent as the X-Request-Id response header.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "description": "\"unknown\" whenever a source needed for this answer timed out, errored, or was skipped - never \"no_flags\" in that case.",
      +  "enum": [
      +    "flagged",
      +    "no_flags",
      +    "unknown"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / test_fixture
      Added value: +{
      +  "description": "true only when the input was a documented integration test fixture and this response is canned; absent on real results.",
      +  "type": "boolean"
      +}
  3. Added

TDQS

A4.8/5.0
Behavior5/5

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

No annotations are provided, so the description carries the full burden and delivers: exact return shape, the semantic meaning of found:false (normal, not an error, not evidence of legitimacy), errors vs found:false for upstream outages, validation rules, rate limits with license-key exemption, and caching TTLs per result type. This is comprehensive behavioral disclosure.

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

Conciseness4/5

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

Front-loaded with purpose and organized into labeled sections (SIBLING DIFFERENTIATION, BEHAVIOR, VALIDATION), which aids scanning. It is on the long side, but nearly every sentence adds distinct operational information; slight redundancy around 'always free' appears twice.

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?

An output schema exists, yet the description still explains return-value semantics (especially found:false), error behavior, caching, and rate limits. For a tool with this complexity, nothing an agent needs to call it correctly and interpret results is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema already documents both parameters. The description adds meaningful behavioral context beyond the schema: validation failure returns isError with specific codes (invalid_address, invalid_chain), case-insensitivity, and per-result caching tied to found vs found:false.

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

Purpose5/5

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

States a specific verb+resource: reports when an EVM wallet first appeared on a chain, based on earliest transfer history, plus contract status. It explicitly differentiates from siblings (check_wallet_sanctions, check_domain_age, check_hostname_reputation), so an agent can distinguish it without opening schemas.

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

Usage Guidelines5/5

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

Explicitly gives when-to-use ('wallet age/history only') and when-not-to-use (sanctions screening, domain age, hostname reputation) with alternative tool names. Also clarifies it is always free, removing a possible selection hesitation.

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.