Skip to main content
Glama

Count the payers of an x402 seller

audit_payers
Read-onlyIdempotent

Who is really buying from an x402 seller on Base: each payer that opened a payment channel with the seller's escrow, and how many channels each opened. It counts the payers, not the relayers that submit their transactions. A call without a line has only a moment, enough for a small range of recent blocks, and is cut, uncharged, when it needs longer. from_block is a block number and defaults to the whole history; Base adds about 43,200 blocks a day. The first answer says how many windows the scan will take and, at the pace of recent scans, how many milliseconds it likely takes (likely_ms) and at most (about_ms, the time a line should hold), and each one after says how many are done and what the rest needs. Paid, on a line: $0.000001 per millisecond. With no wallet code, ZEAM :: Pass buys the time and opens the line: a pass (https://mcp.zeamprism.com/pass) or your own wallet (https://mcp.zeamprism.com/how-to-pay). Example: {"contract":"0x4020074e9dF2ce1deE5A9C1b5c3f541D02a10003","from_block":51000000}

Input Schema

NameRequiredDescriptionDefault
lineNoOptional. A line credential, for a client that cannot send the x-line header or _meta["zeam-pass/line"]: the call runs on that line's time.
windowNooptional int — blocks per snapshot, default 10000; smaller lands the first snapshot sooner.
contractYesstring — an x402 settlement escrow, 0x form.
receiverNooptional string — only channels paying this receiver; omit for all.
to_blockNooptional int — stop; default the head.
from_blockNooptional int — first block; default the whole history. To continue a partial answer, keep it and set to_block one below its scanned.from.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block set to one below scanned.from."New value: +"optional int — first block; default the whole history. To continue a partial answer, keep it and set to_block one below its scanned.from."
    • changedInput schema / properties / window / description
      Previous value: -"optional int — blocks per snapshot, default 10000; smaller gives a short line its first snapshot sooner."New value: +"optional int — blocks per snapshot, default 10000; smaller lands the first snapshot sooner."
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "about_ms": {
      -        "anyOf": [
      -          {
      -            "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      -            "type": "number"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "channels": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "channels opened in the blocks scanned; null before anything is scanned"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "contract": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "detail": {
      -        "anyOf": [
      -          {
      -            "description": "one entry per payer",
      -            "items": {},
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "error": {
      -        "anyOf": [
      -          {
      -            "description": "present when ok is false",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "evidence": {
      -        "anyOf": [
      -          {
      -            "description": "how to reproduce this on any archive node",
      -            "properties": {
      -              "at_block": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "decode": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "method": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "note": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "params": {
      -                "anyOf": [
      -                  {
      -                    "items": {},
      -                    "type": "array"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "ok": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "partial": {
      -        "anyOf": [
      -          {
      -            "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "payers": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ],
      -            "description": "distinct payers in the blocks scanned; null before anything is scanned"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "range": {
      -        "anyOf": [
      -          {
      -            "properties": {
      -              "from": {
      -                "anyOf": [
      -                  {
      -                    "anyOf": [
      -                      {
      -                        "type": "number"
      -                      },
      -                      {
      -                        "type": "string"
      -                      }
      -                    ]
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "to": {
      -                "anyOf": [
      -                  {
      -                    "anyOf": [
      -                      {
      -                        "type": "number"
      -                      },
      -                      {
      -                        "type": "string"
      -                      }
      -                    ]
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "receiver": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "scanned": {
      -        "anyOf": [
      -          {
      -            "description": "the blocks actually covered so far, newest first",
      -            "properties": {
      -              "from": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "to": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "windows": {
      -        "anyOf": [
      -          {
      -            "description": "how far the scan has got",
      -            "properties": {
      -              "about_ms": {
      -                "anyOf": [
      -                  {
      -                    "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "blocks": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "done": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              },
      -              "of": {
      -                "anyOf": [
      -                  {
      -                    "type": "number"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ]
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "accepts"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "receipt"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "about_ms": {
      +        "anyOf": [
      +          {
      +            "description": "ms the rest needs at most; absent when done or untimed",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "channels": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "channels opened in the blocks scanned; null in the plan"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "code": {},
      +      "contract": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "detail": {
      +        "anyOf": [
      +          {
      +            "description": "one entry per payer",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "error": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "evidence": {
      +        "anyOf": [
      +          {
      +            "description": "the call to repeat on any archive node: at_block, method, params and how to decode it, with a warning",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "likely_ms": {
      +        "anyOf": [
      +          {
      +            "description": "ms the rest likely takes, at recent pace",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "note": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "ok": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "partial": {
      +        "anyOf": [
      +          {
      +            "description": "true until the scan reaches range.from",
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "payers": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "distinct payers in the blocks scanned; null in the plan"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "range": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "from": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "to": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "reading": {
      +        "anyOf": [
      +          {
      +            "description": "the count in words",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "receiver": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "scanned": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "properties": {
      +                  "from": {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "to": {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  }
      +                },
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "the blocks covered so far, newest first; null in the plan"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "status": {},
      +      "windows": {
      +        "anyOf": [
      +          {
      +            "description": "how far the scan has got",
      +            "properties": {
      +              "about_ms": {
      +                "anyOf": [
      +                  {
      +                    "description": "on the plan: for the whole scan",
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "blocks": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "done": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "of": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "accepts"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "receipt"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed7 schema fields changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "contract": "0x4020074e9dF2ce1deE5A9C1b5c3f541D02a10003",
      +    "from_block": 51000000
      +  }
      +]
    • changedInput schema / properties / line / description
      Previous value: -"optional — a line credential: the call burns the line's time and carries no payment."New value: +"Optional. A line credential, for a client that cannot send the x-line header or _meta[\"zeam-pass/line\"]: the call runs on that line's time."
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedOutput schema / additionalProperties
      Removed value: -{}
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "properties": {
      +      "about_ms": {
      +        "anyOf": [
      +          {
      +            "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      +            "type": "number"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "channels": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "channels opened in the blocks scanned; null before anything is scanned"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "contract": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "detail": {
      +        "anyOf": [
      +          {
      +            "description": "one entry per payer",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "error": {
      +        "anyOf": [
      +          {
      +            "description": "present when ok is false",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "evidence": {
      +        "anyOf": [
      +          {
      +            "description": "how to reproduce this on any archive node",
      +            "properties": {
      +              "at_block": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "decode": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "method": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "note": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "params": {
      +                "anyOf": [
      +                  {
      +                    "items": {},
      +                    "type": "array"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "ok": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "partial": {
      +        "anyOf": [
      +          {
      +            "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "payers": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "number"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ],
      +            "description": "distinct payers in the blocks scanned; null before anything is scanned"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "range": {
      +        "anyOf": [
      +          {
      +            "properties": {
      +              "from": {
      +                "anyOf": [
      +                  {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "to": {
      +                "anyOf": [
      +                  {
      +                    "anyOf": [
      +                      {
      +                        "type": "number"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "receiver": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "scanned": {
      +        "anyOf": [
      +          {
      +            "description": "the blocks actually covered so far, newest first",
      +            "properties": {
      +              "from": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "to": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "windows": {
      +        "anyOf": [
      +          {
      +            "description": "how far the scan has got",
      +            "properties": {
      +              "about_ms": {
      +                "anyOf": [
      +                  {
      +                    "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "blocks": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "done": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "of": {
      +                "anyOf": [
      +                  {
      +                    "type": "number"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "accepts"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "receipt"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedOutput schema / properties
      Removed value: -{
      -  "about_ms": {
      -    "anyOf": [
      -      {
      -        "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "channels": {
      -    "anyOf": [
      -      {
      -        "description": "channels opened in the range",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "contract": {
      -    "type": [
      -      "string",
      -      "null"
      -    ]
      -  },
      -  "detail": {
      -    "anyOf": [
      -      {
      -        "description": "one entry per payer",
      -        "items": {},
      -        "type": "array"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "error": {
      -    "anyOf": [
      -      {
      -        "description": "present when ok is false",
      -        "type": "string"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "evidence": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "how to reproduce this on any archive node",
      -        "properties": {
      -          "at_block": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "decode": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "method": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "note": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "params": {
      -            "anyOf": [
      -              {
      -                "items": {},
      -                "type": "array"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "ok": {
      -    "type": [
      -      "boolean",
      -      "null"
      -    ]
      -  },
      -  "partial": {
      -    "anyOf": [
      -      {
      -        "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      -        "type": "boolean"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "payers": {
      -    "anyOf": [
      -      {
      -        "description": "distinct payers",
      -        "type": "number"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "range": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "properties": {
      -          "from": {
      -            "type": [
      -              "number",
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "to": {
      -            "type": [
      -              "number",
      -              "string",
      -              "null"
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "receiver": {
      -    "type": [
      -      "string",
      -      "null"
      -    ]
      -  },
      -  "scanned": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "the blocks actually covered so far, newest first",
      -        "properties": {
      -          "from": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "to": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  },
      -  "windows": {
      -    "anyOf": [
      -      {
      -        "additionalProperties": {},
      -        "description": "how far the scan has got",
      -        "properties": {
      -          "about_ms": {
      -            "anyOf": [
      -              {
      -                "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      -                "type": "number"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          "blocks": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "done": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          },
      -          "of": {
      -            "type": [
      -              "number",
      -              "null"
      -            ]
      -          }
      -        },
      -        "type": "object"
      -      },
      -      {
      -        "type": "null"
      -      }
      -    ]
      -  }
      -}
  3. Changed1 schema field changed
    • addedOutput schema / properties / about_ms
      Added value: +{
      +  "anyOf": [
      +    {
      +      "description": "about how many milliseconds the rest of the scan needs, at the pace of recent scans; absent when it is done or no scan of this kind has run",
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  4. Changed8 schema fields changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block."New value: +"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block set to one below scanned.from."
    • addedInput schema / properties / from_block / minimum
      Added value: +0
    • changedInput schema / properties / from_block / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / to_block / minimum
      Added value: +0
    • changedInput schema / properties / to_block / type
      Previous value: -"number"New value: +"integer"
    • addedInput schema / properties / window / minimum
      Added value: +1
    • changedInput schema / properties / window / type
      Previous value: -"number"New value: +"integer"
    • addedOutput schema / properties / windows
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": {},
      +      "description": "how far the scan has got",
      +      "properties": {
      +        "about_ms": {
      +          "anyOf": [
      +            {
      +              "description": "on the first answer: about how long the whole scan takes at the pace of recent scans of this kind; absent until one has run",
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "blocks": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "done": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "of": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
  5. Changed1 schema field changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — start; default the contract's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. 0.65 to 1.6 s per 10,000 blocks here, by the wallet's traffic."New value: +"optional int — the block to start from; default the whole history. If the line runs out mid-scan you get what was scanned so far, marked partial; continue with to_block."
  6. Changed1 schema field changed
    • changedInput schema / properties / line / description
      Previous value: -"optional — your /pay credential: served off your line, no payment; without it, x402 payment in params._meta."New value: +"optional — a line credential: the call burns the line's time and carries no payment."
  7. Changed1 schema field changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — start; default the contract's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. ~0.65 s per 10,000 blocks here."New value: +"optional int — start; default the contract's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. 0.65 to 1.6 s per 10,000 blocks here, by the wallet's traffic."
  8. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "properties": {
      +    "channels": {
      +      "anyOf": [
      +        {
      +          "description": "channels opened in the range",
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "contract": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "detail": {
      +      "anyOf": [
      +        {
      +          "description": "one entry per payer",
      +          "items": {},
      +          "type": "array"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "error": {
      +      "anyOf": [
      +        {
      +          "description": "present when ok is false",
      +          "type": "string"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "evidence": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "description": "how to reproduce this on any archive node",
      +          "properties": {
      +            "at_block": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "decode": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "method": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "note": {
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "params": {
      +              "anyOf": [
      +                {
      +                  "items": {},
      +                  "type": "array"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "ok": {
      +      "type": [
      +        "boolean",
      +        "null"
      +      ]
      +    },
      +    "partial": {
      +      "anyOf": [
      +        {
      +          "description": "true while the scan has not reached range.from; a cut line returns the last partial",
      +          "type": "boolean"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "payers": {
      +      "anyOf": [
      +        {
      +          "description": "distinct payers",
      +          "type": "number"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "range": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "properties": {
      +            "from": {
      +              "type": [
      +                "number",
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "to": {
      +              "type": [
      +                "number",
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "receiver": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "scanned": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "description": "the blocks actually covered so far, newest first",
      +          "properties": {
      +            "from": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "to": {
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "type": "object"
      +}
  9. Changed6 schema fields changed
    • changedInput schema / properties / contract / description
      Previous value: -"string — the x402 settlement escrow, 0x form."New value: +"string — an x402 settlement escrow, 0x form."
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — where to start. Defaults to the contract's deployment — the whole history; the line meters the scan. If the line runs out first you get what was scanned so far, newest blocks first, marked partial with the range covered; call again with to_block below that to continue. Measured 2026-09-17: ~0.65 s per 10,000-block window on this node; the whole history is ~4,900 windows."New value: +"optional int — start; default the contract's deployment (the whole history). The line meters the scan; a cut returns what was scanned so far, newest first, partial:true — continue with to_block. ~0.65 s per 10,000 blocks here."
    • changedInput schema / properties / line / description
      Previous value: -"optional — credential from the /pay socket. With it the call is served off your line and carries no payment. Without it, put x402 payment in params._meta."New value: +"optional — your /pay credential: served off your line, no payment; without it, x402 payment in params._meta."
    • changedInput schema / properties / receiver / description
      Previous value: -"optional string — only channels paying THIS receiver. Omit for every channel on the contract."New value: +"optional string — only channels paying this receiver; omit for all."
    • changedInput schema / properties / to_block / description
      Previous value: -"optional int — where to stop. Defaults to the head."New value: +"optional int — stop; default the head."
    • changedInput schema / properties / window / description
      Previous value: -"optional int — blocks per snapshot, default 10000 (~0.65 s each on this node). Smaller windows give a short line a first snapshot sooner; the whole scan costs about the same."New value: +"optional int — blocks per snapshot, default 10000; smaller gives a short line its first snapshot sooner."
  10. Changed2 schema fields changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — where to start. Defaults to the contract's deployment; the line meters the whole scan."New value: +"optional int — where to start. Defaults to the contract's deployment — the whole history; the line meters the scan. If the line runs out first you get what was scanned so far, newest blocks first, marked partial with the range covered; call again with to_block below that to continue. Measured 2026-09-17: ~0.65 s per 10,000-block window on this node; the whole history is ~4,900 windows."
    • addedInput schema / properties / window
      Added value: +{
      +  "description": "optional int — blocks per snapshot, default 10000 (~0.65 s each on this node). Smaller windows give a short line a first snapshot sooner; the whole scan costs about the same.",
      +  "type": "number"
      +}
  11. Changed2 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / additionalProperties
      Removed value: -false
  12. Changed1 schema field changed
    • changedInput schema / properties / from_block / description
      Previous value: -"optional int — where to start. Defaults to 0."New value: +"optional int — where to start. Defaults to the contract's deployment; the line meters the whole scan."
  13. First observed

TDQS

A3.9/5.0
Behavior5/5

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

The description adds substantial behavior beyond the annotations: paid per-millisecond pricing, what happens when a call runs too long without a line, how a line/pass or wallet is used, how from_block defaults, and how progress and timing are reported. It also explains continuation behavior for partial scans. With annotations already covering read-only and idempotent safety, this is unusually rich 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.

Conciseness3/5

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

The purpose is front-loaded in the first sentence, and the later sentences contain relevant details about line usage, cost, block history, and progress reporting. However, the prose is dense and somewhat meandering, with awkward phrasing such as 'A call without a line has only a moment' and several clauses packed into single sentences. It is informative but not tightly structured.

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?

The tool is complex, involving paid timed scans, line credentials, partial results, and block-range continuation, and the description covers those operational realities. It also explains the first response's timing/window information and how later responses report progress. Since an output schema exists, the description need not detail return fields exhaustively, and what it provides is sufficient for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented in the input schema. The description adds some operational context around from_block and line usage, but much of that overlaps with the schema and it does not deepen parameter meaning substantially beyond what is already structured. A 3 is appropriate when the schema carries most parameter semantics.

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

Purpose4/5

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

The description clearly states a specific action and resource: counting each payer that opened a payment channel with an x402 seller's escrow, and the number of channels each opened. It also distinguishes payers from relayers, which helps disambiguate the concept. It does not explicitly differentiate itself from nearby audit tools such as audit_funders or audit_cluster, so it falls short of a 5.

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

Usage Guidelines3/5

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

Usage is implied through the explanation of line-based calls versus calls without a line, and through the from_block continuation guidance. However, the description never explicitly says when to choose audit_payers over sibling tools like audit_funders or attest_payment. The operational constraints are useful but do not amount to full alternative-selection guidance.

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.

Resources