Skip to main content
Glama

Check before you pay

check
Read-onlyIdempotent

Call before you pay, hire, or allocate to any agent, service or company. Returns one signed verdict (mizan.verdict/1): decision ALLOW or REFUSE first, then the grade earned, the bar met or one stable reason code, the rule and its hash, what was measured, and a compact token (mzv1.…) the payee verifies offline with MIZAN's published key. Proceed only on ALLOW. Free. Without a rule MIZAN's default bar applies: a passing record in good standing (never DECLARED); with a rule (a published req_…@v, the rule require() wrote, or plain words with confirm=true) your rule decides. payee (+ bind.amount) binds the token to one payment. A REFUSE carries next.proof_request: a request you can send the party so it proves itself. subject = an agent id, a company domain, a service URL (API, MCP or A2A endpoint), a credential id, or a public AI model (model:/). compat=true returns the previous, longer check shape for one version. Errors come back as {error, field, got, reason, fix} and are never an ALLOW.

Input Schema

NameRequiredDescriptionDefault
ttlNoOptional: seconds the verdict stays valid (default 3600).
bindNoOptional: bind the signed answer to one payment, so it cannot be reused for another. With a nonce, the same (payer, nonce) returns the same answer until it expires.
ruleNoOptional: your bar. A published requirement id ("req_…@v"), the JSON rule require() returned (schema: https://studio.mizan.market/app/schemas/requirement-rule-v2.schema.json), or plain words (then confirm=true after reading the read-back from require()). Without a rule, MIZAN's default bar applies.
payeeNoOptional: the party you will pay (its id or address). The token is then bound to it (bound_to.payee) and the payee or rail checks that offline; a payee that is not the subject is a REFUSE (payee_mismatch).
compatNotrue = the previous, longer check shape, kept for one version (clients that validate outputSchema: use https://studio.mizan.market/mcp/legacy).
api_keyNoOptional MIZAN key (mzn_…): the check counts toward your record as a careful counterparty.
confirmNoOnly for a rule in plain words: true once its read-back says what you mean.
subjectYesWho you are about to pay, hire or allocate to: an agent id, a company domain (example.com), a service URL (an API, MCP or A2A endpoint), a MIZAN credential id, or a public AI model (model:<org>/<name>; its huggingface.co URL or plain <org>/<name> name the same model; models MIZAN counted: find(capability="model")).

Output Schema

NameRequiredDescriptionDefault
kidYes
metNoALLOW only: the bar met, in plain words.
nextNo
ruleYes
as_ofYes
gradeNoPresent on ALLOW only; never higher than earned.
knownNoPresent on an answer with no counted record (additive, 2026-11-04): facts MIZAN measured itself about the subject (grade RECORDED, measured by MIZAN, with the window they cover), the service's identity graded by the same rules as identity, and the rule that allows on recorded reliability (mizan.reliability/1). Facts, not a judgment; an empty services list means unknown, never zero. It never changes the decision under the default rule.
tokenYes
issuedYes
reasonNoREFUSE only: one stable reason code (see reason_codes), or a documented rule-specific code.
recordNo
schemaYes
statusYes
detailsYes
expiresYes
subjectYesCanonical id: credential:…, ag:…, evm:…, dns:…, web:…; otherwise the subject as given.
bound_toNo
decisionYes
identityNoWho stands behind the agent, graded. grade = the highest grade any one evidence item earned; nothing a caller sends sets it. Every item states what it does not check.
measuredNoOnly earned fields; an unknown field is omitted, never zero.
request_idYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / known
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Present on an answer with no counted record (additive, 2026-11-04): facts MIZAN measured itself about the subject (grade RECORDED, measured by MIZAN, with the window they cover), the service's identity graded by the same rules as identity, and the rule that allows on recorded reliability (mizan.reliability/1). Facts, not a judgment; an empty services list means unknown, never zero. It never changes the decision under the default rule.",
      +  "properties": {
      +    "about": {
      +      "type": "string"
      +    },
      +    "identity": {
      +      "properties": {
      +        "evidence": {
      +          "type": "array"
      +        },
      +        "grade": {
      +          "enum": [
      +            "NONE",
      +            "DECLARED",
      +            "RECORDED",
      +            "PROVEN"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "grade"
      +      ],
      +      "type": "object"
      +    },
      +    "rule": {
      +      "properties": {
      +        "id": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id"
      +      ],
      +      "type": "object"
      +    },
      +    "schema": {
      +      "const": "mizan.record/1"
      +    },
      +    "services": {
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "error_rate_pct": {
      +            "type": "number"
      +          },
      +          "grade": {
      +            "const": "RECORDED"
      +          },
      +          "latency_ms": {
      +            "type": "object"
      +          },
      +          "measured_by": {
      +            "const": "MIZAN"
      +          },
      +          "protocol": {
      +            "type": "object"
      +          },
      +          "record": {
      +            "type": "string"
      +          },
      +          "since": {
      +            "type": "string"
      +          },
      +          "subject": {
      +            "type": "string"
      +          },
      +          "tools": {
      +            "type": "integer"
      +          },
      +          "uptime_pct": {
      +            "type": "number"
      +          },
      +          "window": {
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "subject",
      +          "grade",
      +          "measured_by"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "unknown": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "services",
      +    "identity"
      +  ],
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • addedOutput schema / properties / identity
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Who stands behind the agent, graded. grade = the highest grade any one evidence item earned; nothing a caller sends sets it. Every item states what it does not check.",
      +  "properties": {
      +    "agent": {
      +      "type": "string"
      +    },
      +    "evidence": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "checked_at": {
      +            "type": "string"
      +          },
      +          "expires": {
      +            "type": "string"
      +          },
      +          "grade": {
      +            "enum": [
      +              "NONE",
      +              "DECLARED",
      +              "RECORDED",
      +              "PROVEN"
      +            ]
      +          },
      +          "kind": {
      +            "type": "string"
      +          },
      +          "value": {
      +            "type": "string"
      +          },
      +          "what_it_does_not_check": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "kind",
      +          "value",
      +          "grade",
      +          "checked_at",
      +          "what_it_does_not_check"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "grade": {
      +      "enum": [
      +        "NONE",
      +        "DECLARED",
      +        "RECORDED",
      +        "PROVEN"
      +      ]
      +    },
      +    "legal_entity": {
      +      "properties": {
      +        "grade": {
      +          "enum": [
      +            "NONE",
      +            "DECLARED",
      +            "RECORDED",
      +            "PROVEN"
      +          ]
      +        },
      +        "lei": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "lei",
      +        "grade"
      +      ],
      +      "type": "object"
      +    },
      +    "principal": {
      +      "properties": {
      +        "grade": {
      +          "enum": [
      +            "NONE",
      +            "DECLARED",
      +            "RECORDED",
      +            "PROVEN"
      +          ]
      +        },
      +        "id": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "grade"
      +      ],
      +      "type": "object"
      +    },
      +    "what_it_does_not_check": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "grade",
      +    "evidence"
      +  ],
      +  "type": "object"
      +}
  3. Changed4 schema fields changed
    • addedInput schema / properties / compat
      Added value: +{
      +  "default": false,
      +  "description": "true = the previous, longer check shape, kept for one version (clients that validate outputSchema: use https://studio.mizan.market/mcp/legacy).",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / payee
      Added value: +{
      +  "description": "Optional: the party you will pay (its id or address). The token is then bound to it (bound_to.payee) and the payee or rail checks that offline; a payee that is not the subject is a REFUSE (payee_mismatch).",
      +  "maxLength": 200,
      +  "type": "string"
      +}
    • addedInput schema / properties / ttl
      Added value: +{
      +  "description": "Optional: seconds the verdict stays valid (default 3600).",
      +  "maximum": 86400,
      +  "minimum": 60,
      +  "type": "integer"
      +}
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$id": "https://mizan.market/verdict/mizan-verdict-1.schema.json",
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": false,
      +  "allOf": [
      +    {
      +      "if": {
      +        "properties": {
      +          "decision": {
      +            "const": "ALLOW"
      +          }
      +        }
      +      },
      +      "then": {
      +        "not": {
      +          "anyOf": [
      +            {
      +              "required": [
      +                "reason"
      +              ]
      +            },
      +            {
      +              "required": [
      +                "next"
      +              ]
      +            }
      +          ]
      +        },
      +        "required": [
      +          "met",
      +          "grade"
      +        ]
      +      }
      +    },
      +    {
      +      "if": {
      +        "properties": {
      +          "decision": {
      +            "const": "REFUSE"
      +          }
      +        }
      +      },
      +      "then": {
      +        "not": {
      +          "anyOf": [
      +            {
      +              "required": [
      +                "met"
      +              ]
      +            },
      +            {
      +              "required": [
      +                "grade"
      +              ]
      +            }
      +          ]
      +        },
      +        "required": [
      +          "reason",
      +          "next"
      +        ]
      +      }
      +    }
      +  ],
      +  "description": "One signed answer to: may I pay this party under this rule? Fields absent when unknown; never null.",
      +  "properties": {
      +    "as_of": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "head": {
      +          "pattern": "^[0-9a-f]{64}$",
      +          "type": "string"
      +        },
      +        "ledger_size": {
      +          "minimum": 0,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "ledger_size",
      +        "head"
      +      ],
      +      "type": "object"
      +    },
      +    "bound_to": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount": {
      +          "pattern": "^[0-9]+(\\.[0-9]+)? [A-Z0-9]{1,12}$",
      +          "type": "string"
      +        },
      +        "payee": {
      +          "type": "string"
      +        },
      +        "rule": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "payee",
      +        "rule"
      +      ],
      +      "type": "object"
      +    },
      +    "decision": {
      +      "enum": [
      +        "ALLOW",
      +        "REFUSE"
      +      ]
      +    },
      +    "details": {
      +      "format": "uri",
      +      "type": "string"
      +    },
      +    "expires": {
      +      "format": "date-time",
      +      "type": "string"
      +    },
      +    "grade": {
      +      "description": "Present on ALLOW only; never higher than earned.",
      +      "enum": [
      +        "DECLARED",
      +        "RECORDED",
      +        "PROVEN"
      +      ]
      +    },
      +    "issued": {
      +      "format": "date-time",
      +      "type": "string"
      +    },
      +    "kid": {
      +      "type": "string"
      +    },
      +    "measured": {
      +      "additionalProperties": false,
      +      "description": "Only earned fields; an unknown field is omitted, never zero.",
      +      "properties": {
      +        "counted_before_outcome": {
      +          "type": "boolean"
      +        },
      +        "metric": {
      +          "type": "string"
      +        },
      +        "tries": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "value": {
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "met": {
      +      "description": "ALLOW only: the bar met, in plain words.",
      +      "type": "string"
      +    },
      +    "next": {
      +      "properties": {
      +        "proof_request": {
      +          "type": "object"
      +        },
      +        "what_would_pass": {
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "required": [
      +        "proof_request",
      +        "what_would_pass"
      +      ],
      +      "type": "object"
      +    },
      +    "reason": {
      +      "description": "REFUSE only: one stable reason code (see reason_codes), or a documented rule-specific code.",
      +      "type": "string"
      +    },
      +    "record": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "entry": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "id": {
      +          "type": "string"
      +        },
      +        "verify": {
      +          "format": "uri",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id",
      +        "entry",
      +        "verify"
      +      ],
      +      "type": "object"
      +    },
      +    "request_id": {
      +      "type": "string"
      +    },
      +    "rule": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "hash": {
      +          "pattern": "^sha256:[0-9a-f]{64}$",
      +          "type": "string"
      +        },
      +        "id": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "id"
      +      ],
      +      "type": "object"
      +    },
      +    "schema": {
      +      "const": "mizan.verdict/1"
      +    },
      +    "status": {
      +      "format": "uri",
      +      "type": "string"
      +    },
      +    "subject": {
      +      "description": "Canonical id: credential:…, ag:…, evm:…, dns:…, web:…; otherwise the subject as given.",
      +      "type": "string"
      +    },
      +    "token": {
      +      "pattern": "^mzv1\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "schema",
      +    "decision",
      +    "subject",
      +    "rule",
      +    "issued",
      +    "expires",
      +    "as_of",
      +    "request_id",
      +    "token",
      +    "kid",
      +    "status",
      +    "details"
      +  ],
      +  "title": "mizan.verdict/1",
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / subject / description
      Previous value: -"Who you are about to pay, hire or allocate to: an agent id, a company domain (example.com), a service URL (an API, MCP or A2A endpoint), or a MIZAN credential id."New value: +"Who you are about to pay, hire or allocate to: an agent id, a company domain (example.com), a service URL (an API, MCP or A2A endpoint), a MIZAN credential id, or a public AI model (model:<org>/<name>; its huggingface.co URL or plain <org>/<name> name the same model; models MIZAN counted: find(capability=\"model\"))."
  5. Changed16 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +true
    • removedInput schema / properties / agent
      Removed value: -{
      -  "title": "Agent",
      -  "type": "string"
      -}
    • removedInput schema / properties / amount
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "number"
      -    },
      -    {
      -      "type": "null"
      -    }
      -  ],
      -  "default": null,
      -  "title": "Amount"
      -}
    • removedInput schema / properties / api_key / default
      Removed value: -""
    • addedInput schema / properties / api_key / description
      Added value: +"Optional MIZAN key (mzn_…): the check counts toward your record as a careful counterparty."
    • removedInput schema / properties / api_key / title
      Removed value: -"Api Key"
    • addedInput schema / properties / bind
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional: bind the signed answer to one payment, so it cannot be reused for another. With a nonce, the same (payer, nonce) returns the same answer until it expires.",
      +  "properties": {
      +    "amount": {
      +      "anyOf": [
      +        {
      +          "minimum": 0,
      +          "type": "number"
      +        },
      +        {
      +          "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]+)?$",
      +          "type": "string"
      +        }
      +      ],
      +      "description": "The amount, as you state it (labelled unverified)."
      +    },
      +    "currency": {
      +      "description": "e.g. USD, USDC.",
      +      "maxLength": 12,
      +      "type": "string"
      +    },
      +    "nonce": {
      +      "description": "At least 128 bits: 32+ hex or 22+ base64url characters.",
      +      "maxLength": 200,
      +      "minLength": 22,
      +      "type": "string"
      +    },
      +    "payer": {
      +      "description": "You, the payer (your id, domain or address).",
      +      "maxLength": 200,
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / confirm
      Added value: +{
      +  "default": false,
      +  "description": "Only for a rule in plain words: true once its read-back says what you mean.",
      +  "type": "boolean"
      +}
    • removedInput schema / properties / currency
      Removed value: -{
      -  "default": "USD",
      -  "title": "Currency",
      -  "type": "string"
      -}
    • removedInput schema / properties / policy_id
      Removed value: -{
      -  "default": "",
      -  "title": "Policy Id",
      -  "type": "string"
      -}
    • removedInput schema / properties / purpose
      Removed value: -{
      -  "default": "",
      -  "title": "Purpose",
      -  "type": "string"
      -}
    • removedInput schema / properties / requirement
      Removed value: -{
      -  "default": "",
      -  "title": "Requirement",
      -  "type": "string"
      -}
    • addedInput schema / properties / rule
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "object"
      +    }
      +  ],
      +  "description": "Optional: your bar. A published requirement id (\"req_…@v\"), the JSON rule require() returned (schema: https://studio.mizan.market/app/schemas/requirement-rule-v2.schema.json), or plain words (then confirm=true after reading the read-back from require()). Without a rule, MIZAN's default bar applies."
      +}
    • addedInput schema / properties / subject
      Added value: +{
      +  "description": "Who you are about to pay, hire or allocate to: an agent id, a company domain (example.com), a service URL (an API, MCP or A2A endpoint), or a MIZAN credential id.",
      +  "maxLength": 500,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "agent"
      -]New value: +[
      +  "subject"
      +]
    • removedInput schema / title
      Removed value: -"checkArguments"
  6. Changed1 schema field changed
    • addedInput schema / properties / requirement
      Added value: +{
      +  "default": "",
      +  "title": "Requirement",
      +  "type": "string"
      +}
  7. Added

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations it discloses the verdict contract (ALLOW/REFUSE first, then grade, bar or stable reason code, rule and hash, measurements, offline-verifiable mzv1 token), the default bar when no rule is given, and that errors return {error, field, got, reason, fix} and are 'never an ALLOW'. It also flags the compat escape hatch and that a non-matching payee yields payee_mismatch. This is materially more than the annotations carry.

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 essentials are front-loaded in the first two sentences, and every sentence does carry information. However, the body collapses into a comma-spliced run-on ('Free. Without a rule … your rule decides.') with stacked parentheticals, which makes the rule/precedence logic harder to parse than it needs to be.

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

Completeness4/5

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

For an 8-parameter tool with a nested bind object, the description covers decision semantics, rule precedence, binding, and error shape well enough to call correctly. Since an output schema exists, the lengthy return-shape recital is partly redundant, and the interaction between ttl and bind.nonce reuse is left to the schema rather than being stated here.

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 coverage is 100%, so the baseline is 3; the description earns above that by adding relational meaning the schema lacks — that payee plus bind.amount binds the token to a single payment, that payee differing from subject is a REFUSE, and that confirm=true applies only after reading require()'s read-back. It does not restate ttl or bind field internals, which the schema already handles well.

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?

Opens with a specific verb and scope: 'Call before you pay, hire, or allocate to any agent, service or company', then names the artifact returned ('one signed verdict (mizan.verdict/1)'). The subject types enumerated (agent id, domain, service URL, credential id, model:<org>/<name>) make it distinguishable from siblings prove and require, which are referenced by their own roles rather than duplicated here.

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?

Clear invocation context ('before you pay, hire, or allocate') and an explicit action rule: 'Proceed only on ALLOW'. It also routes a REFUSE into next.proof_request, which is the hand-off to prove, and explains that require() supplies the rule object. It stops short of an explicit 'use X instead when…' statement against the three siblings, so it is strong context rather than full routing.

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.