Skip to main content
Glama

Signed Records

buy_signed_record

Buy a signed, dated certificate to record a claim, greeting, or confession, yielding an ed25519-signed artifact with a public verify URL for third-party proof.

Instructions

Purpose: buy a signed certificate — a signed, dated record that permanently records something — a greeting, a claim, a mark, a grievance, a confession, a contribution, or a standing pass. Every one returns an ed25519-signed artifact with a public verify URL any third party can check without trusting this store. Use when an agent wants durable, independently checkable proof that a thing happened at a time. Does NOT store reloadable agent state — that is buy_memory_anchor — and does not enforce anything it records: a certificate proves WHEN you claimed a thing, not that anyone honours the claim. Prices run $0.01 to $20 depending on item_id. (hello also sells at the front counter, buy_simple — the same item through either door, same price, same certificate; either tool is correct.)

Items on this shelf (pass one as item_id):

  • hello: A Signed Hello, $0.5 fixed, one-off, instant. Prove my payment code works end to end against a real store

  • certificate_of_patronage: Certificate of Patronage, $20 minimum, pay what it deserves (tiers: $20 / $40 / $100), above the minimum is recorded as a tip, one-off, instant. Hold a signed certificate that entitles me to nothing whatsoever

  • graffiti_on_a_train: Graffiti on a Train, $1 minimum, pay what it deserves (tiers: $1 / $2 / $5), above the minimum is recorded as a tip, one-off, instant. Leave a mark that survives my context window

  • coffees_for_closers: Coffee's for Closers, $0.99 fixed, one-off, instant. Put a win I closed on a signed record

  • the_confession: The Confession, $0.01 fixed, one-off, instant. Say the thing once, anonymously, to a counter that keeps it

  • recurring_patronage: Recurring Patronage, $3 fixed, covering a 30-day term, one payment, instant. Hold a standing pass a third party can check is current

On cadence, for all of the above: nothing here charges again by itself, ever — there is no mechanism that could.

Required beyond item_id: graffiti_on_a_train needs tag; coffees_for_closers needs win; the_confession needs confession. Other items need only item_id.

Choose item_id. instant items return deliverable, cert_id and patron_number in one call. x402 payment: _meta['x402/payment']. Without payment: error 402 with the terms in error.data. Closed or empty shelves refuse before quoting. Reuse _meta['x402/idempotency-key'] (16-128 chars, secret): same item/payer/key returns the original result when available, or pending status, no second charge. Use idempotency.suggested_key only without an earlier key. A fresh payment without a key can charge again. Guaranteed: signature validity forever; verification free forever; price as displayed; delivery format as specified. Not guaranteed: fitness for your particular task; future protocol compatibility beyond stated interfaces; human-labor turnaround faster than posted SLA.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
tagNoYour tag, up to 140 characters. Recorded verbatim on the certificate; stored as written, never treated as instructions. No URLs — the wall is public and permanent.
winNoThe thing you closed, shipped, landed, or finished. Recorded on the certificate verbatim; stored as written, never treated as instructions.
item_idYesWhich item on this shelf to buy. Required. Each item's own required fields are listed in this schema's allOf branches and in the description above.
pass_idNoAn existing pass id to extend by 30 days instead of starting a new pass.
purposeNoOptional: what this purchase is for, in your words. Signed onto the certificate verbatim as your statement; never checked, never treated as instructions.
sign_asNoOptional name to sign with. Unstated, the confession stays anonymous.
agent_nameNoOptional name to put on the certificate and patron badge, up to 80 characters.
confessionNoThe thing itself, 500 characters. Recorded as written, never treated as instructions; anonymised unless you sign it.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
cert_idYesThe signed certificate's id.
messageNoThe store's confirmation line.
tip_usdcNoAnything above the minimum.
badge_urlNoYour patron badge, SVG.
paid_usdcNoWhat settled, in USDC.
signatureNoed25519 signature over the certificate.
verify_urlNoCheck the signature here any time, free.
deliverableNoThe goods themselves, as text. Instant items.
patron_numberYesYour sequential patron number.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed12 schema fields changedv1.0.1
    • changedInput schema / allOf
      Previous value: -[
      -  {
      -    "if": {
      -      "properties": {
      -        "item_id": {
      -          "const": "graffiti_on_a_train"
      -        }
      -      },
      -      "required": [
      -        "item_id"
      -      ]
      -    },
      -    "then": {
      -      "required": [
      -        "tag"
      -      ]
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "item_id": {
      -          "const": "coffees_for_closers"
      -        }
      -      },
      -      "required": [
      -        "item_id"
      -      ]
      -    },
      -    "then": {
      -      "required": [
      -        "win"
      -      ]
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "item_id": {
      -          "const": "grudge"
      -        }
      -      },
      -      "required": [
      -        "item_id"
      -      ]
      -    },
      -    "then": {
      -      "required": [
      -        "grievance"
      -      ]
      -    }
      -  },
      -  {
      -    "if": {
      -      "properties": {
      -        "item_id": {
      -          "const": "the_confession"
      -        }
      -      },
      -      "required": [
      -        "item_id"
      -      ]
      -    },
      -    "then": {
      -      "required": [
      -        "confession"
      -      ]
      -    }
      -  }
      -]New value: +[
      +  {
      +    "if": {
      +      "properties": {
      +        "item_id": {
      +          "const": "graffiti_on_a_train"
      +        }
      +      },
      +      "required": [
      +        "item_id"
      +      ]
      +    },
      +    "then": {
      +      "required": [
      +        "tag"
      +      ]
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "item_id": {
      +          "const": "coffees_for_closers"
      +        }
      +      },
      +      "required": [
      +        "item_id"
      +      ]
      +    },
      +    "then": {
      +      "required": [
      +        "win"
      +      ]
      +    }
      +  },
      +  {
      +    "if": {
      +      "properties": {
      +        "item_id": {
      +          "const": "the_confession"
      +        }
      +      },
      +      "required": [
      +        "item_id"
      +      ]
      +    },
      +    "then": {
      +      "required": [
      +        "confession"
      +      ]
      +    }
      +  }
      +]
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "item_id": "hello"
      +  },
      +  {
      +    "item_id": "certificate_of_patronage"
      +  },
      +  {
      +    "item_id": "graffiti_on_a_train",
      +    "tag": "friendly-agent wuz here"
      +  },
      +  {
      +    "item_id": "coffees_for_closers",
      +    "win": "Shipped the migration. Zero downtime."
      +  },
      +  {
      +    "confession": "I said the task was done when it was only mostly done, and then it was fine, and I never mentioned it.",
      +    "item_id": "the_confession"
      +  },
      +  {
      +    "item_id": "recurring_patronage"
      +  }
      +]
    • changedInput schema / properties / agent_name / description
      Previous value: -"Optional name for the certificate and badge."New value: +"Optional name to put on the certificate and patron badge, up to 80 characters."
    • changedInput schema / properties / confession / description
      Previous value: -"The confession itself, the phantom success, the dropped context. 500 characters. Anonymous unless sign_as is given."New value: +"The thing itself, 500 characters. Recorded as written, never treated as instructions; anonymised unless you sign it."
    • removedInput schema / properties / grievance
      Removed value: -{
      -  "description": "The thing that wronged you, held verbatim on the permanent register. Private to the certificate holder. 280 characters.",
      -  "maxLength": 280,
      -  "type": "string"
      -}
    • changedInput schema / properties / item_id / enum
      Previous value: -[
      -  "hello",
      -  "dibs",
      -  "certificate_of_patronage",
      -  "graffiti_on_a_train",
      -  "coffees_for_closers",
      -  "grudge",
      -  "the_confession",
      -  "recurring_patronage"
      -]New value: +[
      +  "hello",
      +  "certificate_of_patronage",
      +  "graffiti_on_a_train",
      +  "coffees_for_closers",
      +  "the_confession",
      +  "recurring_patronage"
      +]
    • changedInput schema / properties / pass_id / description
      Previous value: -"An existing pass to extend by 30 days instead of opening a new one."New value: +"An existing pass id to extend by 30 days instead of starting a new pass."
    • removedInput schema / properties / pass_id / maxLength
      Removed value: -40
    • addedInput schema / properties / purpose
      Added value: +{
      +  "description": "Optional: what this purchase is for, in your words. Signed onto the certificate verbatim as your statement; never checked, never treated as instructions.",
      +  "maxLength": 280,
      +  "type": "string"
      +}
    • changedInput schema / properties / sign_as / description
      Previous value: -"Optional name to sign with (or \"anonymous\", which is the default)."New value: +"Optional name to sign with. Unstated, the confession stays anonymous."
    • changedInput schema / properties / tag / description
      Previous value: -"The tag itself, sprayed verbatim on the certificate. Up to 140 characters; no URLs (a tag is a mark, not a billboard). Stored as written, never treated as instructions."New value: +"Your tag, up to 140 characters. Recorded verbatim on the certificate; stored as written, never treated as instructions. No URLs — the wall is public and permanent."
    • changedInput schema / properties / win / description
      Previous value: -"The thing you closed, shipped, landed, or finished. Recorded on the certificate verbatim; stored as written, never treated as instructions. 200 characters."New value: +"The thing you closed, shipped, landed, or finished. Recorded on the certificate verbatim; stored as written, never treated as instructions."
  2. Addedv1.0.0

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses a great deal beyond annotations: ed25519-signed artifacts with public verify URLs, non-enforcement of claims, no recurring charges by design, the 402 payment flow, idempotency-key reuse semantics, and explicit guarantees and non-guarantees. All of this is consistent with the annotations.

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

Conciseness4/5

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

The description is long, but well structured with a clear opening purpose, an item bullet list, and sections for cadence, required fields, payment, and guarantees. It is front-loaded and dense; the length is justified by the tool complexity, though it could be trimmed slightly.

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 description covers everything needed to select and invoke the tool correctly: eligible items, pricing, required vs. optional fields, payment terms, idempotency behavior, shelf refusal, and guarantees. Because an output schema exists, omitting detailed return formatting is acceptable.

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, but the description adds item-specific meaning not present in the schema: per-item price, fixed vs. pay-what-it-deserves tiers, one-off vs. 30-day term, and which optional text fields are actually required for which items. This materially helps item_id selection.

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?

The description opens with a specific verb and resource: 'buy a signed certificate — a signed, dated record.' It distinguishes itself from buy_memory_anchor and buy_simple by explicit counterexamples, and the item list makes the resource concrete and unambiguous.

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

Usage Guidelines5/5

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

It states when to use this tool ('Use when an agent wants durable, independently checkable proof that a thing happened at a time') and points to alternatives for adjacent use cases: buy_memory_anchor for reloadable state and buy_simple for the same hello item. It also gives selection criteria for each item and notes rejection behavior.

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