Skip to main content
Glama

See how a server refuses an unpaid call

attest_payment
Read-onlyIdempotent

Returns how one MCP endpoint refuses an unpaid call. Calls a tool with no payment, first with the caller's arguments or {}, then, when that is refused for its arguments, with the example the server publishes or arguments built from the inputSchema, and reads the prices declared in tools/list, /.well-known/x402 and /openapi.json; the verdict is paid, not_paid or undetermined, and every probe is listed with its answer. Terms are parsed with the canonical x402 schema: version, HTTP status against body (a 402 body under HTTP 200 is invisible to anything that counts by status), accepts rows and whether several share one (scheme, network) key so an indexer keeps only the last, non-schema keys, which asset sits first and last, and whether the refusal carries anything a wallet-less caller can act on. Then calls the same tool with a required argument missing, with an argument of the wrong type and with {} (whatever arguments the caller gave), and reports the order observed: payment first, validation first, mixed, or not determined when the schema gives nothing to vary. Never pays. It makes five or more requests to the server named and takes as long as they take, up to 15 s each: a request not answered by then is reported timed_out, never as the server's answer. A call cut for time returns nothing. 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: {"url":"https://mcp.zeamprism.com/mcp","tool":"audit_payers"}

Input Schema

NameRequiredDescriptionDefault
urlYesstring — the MCP endpoint, absolute http(s) URL, e.g. https://host/mcp. Private and internal names and addresses are refused.
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.
toolNooptional string — the tool to call unpaid; default: the first tool that answers an unpaid call with x402 terms, trying the tools the server prices first, then the unpriced ones in tools/list order (at most `probe` tools are tried).
probeNooptional int — how many tools to try when `tool` is omitted; default 5.
argumentsNooptional object — arguments for that tool, sent first and as given; default: {}, then the example the server publishes for the tool, then arguments built from its inputSchema.

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "at": {
      -        "anyOf": [
      -          {
      -            "description": "ISO time of the run",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "basis": {
      -        "anyOf": [
      -          {
      -            "description": "what decided the verdict",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "declared": {
      -        "anyOf": [
      -          {
      -            "description": "what the server itself says the tool costs: source, says (paid | free), price",
      -            "items": {},
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "error": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "evidence": {
      -        "anyOf": [
      -          {
      -            "description": "every request made, in the order sent: method, url, request headers of note, status, ms; a request that drew no answer has status 0 and its error, a redirect followed is listed in redirects, and a request still unanswered when a report was cut has unanswered: true",
      -            "items": {},
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "ok": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "price_drift": {
      -        "anyOf": [
      -          {
      -            "description": "live amount vs openapi x-payment-info for the same tool, when both exist",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "reason": {
      -        "anyOf": [
      -          {
      -            "description": "when undetermined: why",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "refusal": {
      -        "anyOf": [
      -          {
      -            "description": "the unpaid call that drew terms: payment_required, where the terms were found, schema_ok, http_status, terms, accepts analysis, guidance keys, reading",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "sources": {
      -        "anyOf": [
      -          {
      -            "description": "the price declarations read: tools/list _meta, /.well-known/x402, /openapi.json",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "tool": {
      -        "anyOf": [
      -          {
      -            "anyOf": [
      -              {
      -                "type": "string"
      -              },
      -              {
      -                "type": "null"
      -              }
      -            ]
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "tried": {
      -        "anyOf": [
      -          {
      -            "description": "every probe in order: tool, probe, arguments, answer, http_status, detail",
      -            "items": {},
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "url": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "validation_order": {
      -        "anyOf": [
      -          {
      -            "description": "order: payment-first | validation-first | mixed | not-determined, from the same tool called unpaid with valid arguments, with a required argument missing and with a wrong-typed argument; probes lists each call and its answer, refused_before_terms and terms_despite name the kinds",
      -            "properties": {},
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "verdict": {
      -        "anyOf": [
      -          {
      -            "description": "paid | not_paid | undetermined. not_paid only when an unpaid call ran or the server prices the tool free; a call refused for its arguments is undetermined",
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "accepts"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "required": [
      -      "receipt"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "at": {
      +        "anyOf": [
      +          {
      +            "description": "ISO time of the run",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "basis": {
      +        "anyOf": [
      +          {
      +            "description": "what decided the verdict",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "declared": {
      +        "anyOf": [
      +          {
      +            "description": "what the server itself says the tool costs: source, says (paid | free), price",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "error": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "evidence": {
      +        "anyOf": [
      +          {
      +            "description": "every request made, in the order sent: method, url, request headers of note, status, ms; a request that drew no answer has status 0 and its error; one this shelf stopped has status null and says why: timed_out with limit_ms (no answer in 15 s), too_large with limit_bytes, or canceled; a redirect followed is listed in redirects, and a request still unanswered when a report was cut has unanswered: true",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "ok": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "price_drift": {
      +        "anyOf": [
      +          {
      +            "description": "live amount vs openapi x-payment-info for the same tool, when both exist",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "reason": {
      +        "anyOf": [
      +          {
      +            "description": "when undetermined: why",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "refusal": {
      +        "anyOf": [
      +          {
      +            "description": "the unpaid call that drew terms: payment_required, where the terms were found, schema_ok, http_status, terms, accepts analysis, guidance keys, reading",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "sources": {
      +        "anyOf": [
      +          {
      +            "description": "the price declarations read: tools/list _meta, /.well-known/x402, /openapi.json",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "tool": {
      +        "anyOf": [
      +          {
      +            "anyOf": [
      +              {
      +                "type": "string"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "tried": {
      +        "anyOf": [
      +          {
      +            "description": "every probe in order: tool, probe, arguments, answer, http_status, detail",
      +            "items": {},
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "validation_order": {
      +        "anyOf": [
      +          {
      +            "description": "order: payment-first | validation-first | mixed | not-determined, from the same tool called unpaid with valid arguments, with a required argument missing, with a wrong-typed argument and with empty arguments whatever arguments the caller gave; probes lists each call and its answer, refused_before_terms and terms_despite name the kinds",
      +            "properties": {},
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "verdict": {
      +        "anyOf": [
      +          {
      +            "description": "paid | not_paid | undetermined. not_paid only when an unpaid call ran or the server prices the tool free; a call refused for its arguments is undetermined",
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "accepts"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "required": [
      +      "receipt"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Added

TDQS

A3.8/5.0
Behavior5/5

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

Beyond the annotations, the description discloses critical behavior: it makes five or more requests, waits up to 15 seconds per request, reports timeouts rather than server answers, never pays, and returns nothing if cut for time. It also explains the paid-line cost model, which is important operational context for an open-world probing tool.

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

Conciseness2/5

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

The description is a dense, run-on block with many parenthetical details and several sentences that restate schema or output-schema material. The purpose is front-loaded, but the structure is poor and the length is excessive for a tool whose parameters and return shape are already fully documented.

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?

Given the complexity, annotations, full parameter schema, and output schema, the description is complete enough for an agent to call the tool correctly. It covers probing behavior, timeouts, cost, verdicts, and the no-payment guarantee.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents url, line, tool, probe, and arguments in detail. The description reinforces the probing order and defaults, but adds little semantic meaning beyond what the schema already provides.

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

Purpose4/5

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

The description states a specific verb and resource: it returns how one MCP endpoint refuses an unpaid call and probes payment/validation behavior. The scope is clear enough to distinguish it from generic server probing, but it never explicitly contrasts itself with siblings such as attest_server, attest_discovery, or get_payment_terms.

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?

The description implies when this tool is useful: when an agent needs to see refusal behavior, payment terms, or validation ordering without paying. However, it gives no explicit when-to-use/when-not-to-use guidance and does not name an alternative sibling tool for overlapping needs.

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