Skip to content
Back to touchstone

Card snapshot

touchstone.locomot.io · 2026-10-01 18:15:28 UTC · 6536e7c0ca4c0faa7629cb59c616be6b3c81be258497bc6fd5beba50968b71e1

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "name": "touchstone",
  "description": "Verified-reality oracle for agents: deterministic, signed answers to the facts an agent cannot afford to get wrong \u2014 sun/moon/planet positions, geomagnetic field, time zones and holidays, NIST unit conversion, signature recovery, provably-fair randomness, timelock encryption, prosody, readability, syntax, citations, diffs. Same input, same bytes, every answer signed. Structured invocation only: this agent parses, it does not guess.",
  "version": "2026-09-27",
  "protocolVersion": "0.3",
  "supportedInterfaces": [
    {
      "url": "https://touchstone.locomot.io/a2a/v1",
      "protocolBinding": "JSONRPC",
      "protocolVersion": "0.3"
    },
    {
      "url": "https://touchstone.locomot.io/a2a/json",
      "protocolBinding": "HTTP+JSON",
      "protocolVersion": "0.3"
    }
  ],
  "url": "https://touchstone.locomot.io/a2a/v1",
  "preferredTransport": "JSONRPC",
  "additionalInterfaces": [
    {
      "url": "https://touchstone.locomot.io/a2a/v1",
      "transport": "JSONRPC"
    },
    {
      "url": "https://touchstone.locomot.io/a2a/json",
      "transport": "HTTP+JSON"
    }
  ],
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false,
    "extensions": [
      {
        "uri": "https://github.com/google-agentic-commerce/a2a-x402/blob/main/spec/v0.2",
        "description": "Paid skills are settled with x402 (USDC on Base mainnet). The payment requirements returned in task.status.message.metadata['x402.payment.required'] are the verbatim challenge this service's own HTTP route issues, so the A2A price and the HTTP price cannot disagree. Note: this deployment speaks x402 v2 (challenge carries `amount`), while the extension's examples show v1 (`maxAmountRequired`) \u2014 the object is passed through unedited rather than reshaped, so what you sign is what we charge.",
        "required": true
      }
    ]
  },
  "securitySchemes": {
    "x402": {
      "description": "x402 micropayment in USDC on Base. Send a message with no payment to receive the requirements, sign them, then send a second message on the same taskId with metadata['x402.payment.payload'].",
      "httpAuthSecurityScheme": {
        "scheme": "x402"
      }
    }
  },
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "auction.create",
      "name": "auction create",
      "description": "Open a sealed-bid auction (close round N). Bidders timelock-seal bids to N; nobody can read any bid until N; highest wins, signed + re-verifiable. bid/open/get are free.",
      "tags": [
        "auction",
        "deterministic",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "auction.create title=rare widget #7 duration=24h"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "description": "what's auctioned"
          },
          "round": {
            "type": "integer",
            "description": "close: a drand round"
          },
          "duration": {
            "type": "string",
            "description": "close: e.g. '24h','7d'"
          },
          "decrypt_time": {
            "type": "string",
            "description": "close: ISO time"
          }
        }
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.01"
    },
    {
      "id": "auction.open",
      "name": "auction open",
      "description": "Open (settle) a sealed-bid auction whose deadline has passed.",
      "tags": [
        "auction",
        "deterministic",
        "free",
        "verifiable"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "auction.open auction_id=<id from /auction/create>"
      ]
    },
    {
      "id": "cite",
      "name": "cite",
      "description": "Deterministic citation formatter \u2014 APA 7, MLA 9, Chicago 17 author-date, BibTeX. From structured fields, returns the reference entry (markdown/html/plain) + the in-text citation, reproducing published style-manual examples exactly. For full author lists use POST. Every answer signed.",
      "tags": [
        "cite",
        "deterministic",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "cite style=apa type=article title=On the electrodynamics of moving bodies authors=Einstein, Albert year=1905 container=Annalen der Physik volume=17 pages=891-921",
        "https://touchstone.locomot.io/play/cite"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "style": {
            "type": "string",
            "description": "apa | mla | chicago | bibtex"
          },
          "type": {
            "type": "string",
            "description": "article | book | chapter | web"
          },
          "title": {
            "type": "string",
            "description": "work title (verbatim case)"
          },
          "authors": {
            "type": "string",
            "description": "'Family, Given; Family2, Given2'"
          },
          "year": {
            "type": "string"
          },
          "container": {
            "type": "string",
            "description": "journal/site name"
          },
          "volume": {
            "type": "string"
          },
          "issue": {
            "type": "string"
          },
          "pages": {
            "type": "string"
          },
          "publisher": {
            "type": "string"
          },
          "place": {
            "type": "string"
          },
          "doi": {
            "type": "string"
          },
          "url": {
            "type": "string"
          }
        },
        "required": [
          "style",
          "title"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "credits",
      "name": "credits",
      "description": "Buy a prepaid key ONCE, then call every paid route with Authorization: Bearer <key> and no further signing. $1.00 buys $1.20 of credit (20% bulk discount); each call debits its own route price. The key is returned exactly once and is stored hashed \u2014 it cannot be recovered.",
      "tags": [
        "credits",
        "deterministic",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "https://touchstone.locomot.io/credits/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {}
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$1.00"
    },
    {
      "id": "diff",
      "name": "diff",
      "description": "Exact structured diff. mode=text -> unified diff + line counts; mode=json -> an RFC 6902 JSON Patch (RFC 6901 pointers) that round-trips a->b; mode=words -> inline word-level opcodes. For large inputs use POST. Every answer signed.",
      "tags": [
        "deterministic",
        "diff",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "diff a={\"v\":1} b={\"v\":2} mode=json",
        "https://touchstone.locomot.io/play/diff"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "a": {
            "type": "string",
            "description": "the 'before' input"
          },
          "b": {
            "type": "string",
            "description": "the 'after' input"
          },
          "mode": {
            "type": "string",
            "description": "text | json | words"
          }
        },
        "required": [
          "a",
          "b"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "door",
      "name": "door",
      "description": "Before you pay an x402 door, check it against its catalogue entry. A nightly probe of EVERY host in the x402 index (1,618 hosts, 15,227 listings, 100% coverage): the live 402's real payTo and price versus what the catalogue claims, plus dead and self-contradicting hosts. 28.6% of listings sit on a host the catalogue gets wrong \u2014 one names one payee and pays another across 965 listings.",
      "tags": [
        "deterministic",
        "door",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "door url=https://api.m2mcent.com/",
        "https://touchstone.locomot.io/play/door"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "the x402 resource URL you are about to pay"
          },
          "full": {
            "type": "boolean",
            "description": "include every sampled observation"
          }
        },
        "required": [
          "url"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.002"
    },
    {
      "id": "field",
      "name": "field",
      "description": "Deterministic WMM2025 magnetic field (one location/date).",
      "tags": [
        "deterministic",
        "field",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "field lat=40.7128 lon=-74.006",
        "https://touchstone.locomot.io/play/field"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "altitude_km": {
            "type": "number",
            "description": "optional, default 0; WMM valid [-1,850]"
          },
          "when": {
            "type": "string",
            "description": "ISO date / decimal year; default now"
          }
        },
        "required": [
          "lat",
          "lon"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.002"
    },
    {
      "id": "proofread",
      "name": "proofread",
      "description": "Deterministic, rule-based proofreading flags \u2014 passive voice, adverbs, wordiness, filler, repeated words, whitespace, a/an, punctuation, sentence length, capitalization. Each flag carries an offset + suggestion. For long text use POST.",
      "tags": [
        "deterministic",
        "proofread",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "proofread text=The the cat was eaten by a dog in order to win.",
        "https://touchstone.locomot.io/proofread/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "text to proofread"
          }
        },
        "required": [
          "text"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "prosody",
      "name": "prosody",
      "description": "Deterministic phonetic rhyme (perfect + scored slant), pronunciation, syllables, scansion, homophones \u2014 from CMUdict.",
      "tags": [
        "deterministic",
        "prosody",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "prosody op=rhyme word=orange max=6",
        "https://touchstone.locomot.io/play/prosody"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "rhyme",
              "pronounce",
              "syllables",
              "scan",
              "homophones"
            ],
            "description": "operation; default rhyme"
          },
          "word": {
            "type": "string",
            "description": "the word"
          },
          "text": {
            "type": "string",
            "description": "syllables: any text"
          },
          "line": {
            "type": "string",
            "description": "scan: a line of verse"
          },
          "types": {
            "type": "string",
            "description": "rhyme: perfect,assonance,consonance,slant"
          },
          "syllables": {
            "type": "integer",
            "description": "rhyme: filter by syllable count"
          },
          "meter": {
            "type": "string",
            "description": "rhyme: filter by stress pattern"
          },
          "max": {
            "type": "integer",
            "description": "rhyme: result count"
          },
          "min_score": {
            "type": "number",
            "description": "rhyme: min closeness 0-1"
          }
        }
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "random",
      "name": "random",
      "description": "Provably-fair random draw (dice, ints, choice, shuffle, bytes) seeded from the current drand quicknet beacon. Free; GET /random/proof adds the full inline cryptographic receipt.",
      "tags": [
        "deterministic",
        "free",
        "random",
        "verifiable"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "random op=dice dice=2d6"
      ]
    },
    {
      "id": "random.proof",
      "name": "random proof",
      "description": "Provably-fair draw from the drand beacon with the full verifiable receipt + nonce-binding (the free draw is at GET /random).",
      "tags": [
        "deterministic",
        "random",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "random.proof op=pick items=alice,bob,carol,dave k=1 nonce=raffle-1"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "int",
              "dice",
              "coin",
              "bytes",
              "uuid",
              "shuffle",
              "sample",
              "choice",
              "pick"
            ],
            "description": "draw type; default int"
          },
          "nonce": {
            "type": "string",
            "description": "bind the draw to your context"
          },
          "round": {
            "type": "integer",
            "description": "pin a drand round (reproducible)"
          },
          "min": {
            "type": "integer"
          },
          "max": {
            "type": "integer"
          },
          "count": {
            "type": "integer"
          },
          "dice": {
            "type": "string",
            "description": "e.g. 3d6"
          },
          "n": {
            "type": "integer"
          },
          "sides": {
            "type": "integer"
          },
          "items": {
            "type": "string",
            "description": "comma list or JSON array"
          },
          "k": {
            "type": "integer"
          },
          "weights": {
            "type": "string"
          }
        }
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "readability",
      "name": "readability",
      "description": "Deterministic readability scores (Flesch, Flesch-Kincaid, Gunning Fog, SMOG, Coleman-Liau, ARI) over published formulas. For long text use POST. Signed.",
      "tags": [
        "deterministic",
        "readability",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "readability text=The cat sat on the mat. It was a bright day.",
        "https://touchstone.locomot.io/readability/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "the text to score"
          }
        },
        "required": [
          "text"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "sealed",
      "name": "sealed",
      "description": "Timelock encryption (tlock / encrypt-to-the-future): seal a payload toward a future drand round \u2014 undecryptable by anyone, including us, until that round lands; or open a landed seal. For sealed-bid auctions, commit-reveal, scheduled secrets, dead-man switches. age-armored, interoperable. Free zero-knowledge inspect at /sealed/inspect.",
      "tags": [
        "deterministic",
        "sealed",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "sealed op=encrypt data=sealed bid: 500 USDC duration=10d",
        "https://touchstone.locomot.io/sealed/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "encrypt",
              "decrypt"
            ],
            "description": "operation; default encrypt"
          },
          "data": {
            "type": "string",
            "description": "encrypt: plaintext to seal"
          },
          "round": {
            "type": "integer",
            "description": "encrypt: target drand round"
          },
          "duration": {
            "type": "string",
            "description": "encrypt: time to unlock e.g. '10d'"
          },
          "decrypt_time": {
            "type": "string",
            "description": "encrypt: ISO unlock time"
          },
          "ciphertext": {
            "type": "string",
            "description": "decrypt: age-armored seal"
          }
        }
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.005"
    },
    {
      "id": "sealed.inspect",
      "name": "sealed inspect",
      "description": "Inspect a timelock ciphertext: which drand round it unlocks at and when that is, without decrypting.",
      "tags": [
        "deterministic",
        "free",
        "sealed",
        "verifiable"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "sealed.inspect ciphertext=<armored timelock ciphertext>"
      ]
    },
    {
      "id": "sky",
      "name": "sky",
      "description": "Deterministic ephemeris snapshot (one location/time).",
      "tags": [
        "deterministic",
        "sky",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "sky lat=40.7128 lon=-74.006",
        "https://touchstone.locomot.io/play/sky"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "elevation_m": {
            "type": "number",
            "description": "optional, default 0"
          },
          "when": {
            "type": "string",
            "description": "ISO-8601 UTC; default now"
          }
        },
        "required": [
          "lat",
          "lon"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.003"
    },
    {
      "id": "syntax",
      "name": "syntax",
      "description": "Deterministic syntax validation \u2014 does this JSON/YAML/TOML/Python/regex parse? Valid/invalid + error location from the canonical parser. For long source use POST.",
      "tags": [
        "deterministic",
        "syntax",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "syntax content={\"a\": 1} lang=json",
        "https://touchstone.locomot.io/play/syntax"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "description": "code/config to validate"
          },
          "lang": {
            "type": "string",
            "description": "json | yaml | toml | python | regex"
          },
          "test": {
            "type": "string",
            "description": "regex only: string to match"
          }
        },
        "required": [
          "content",
          "lang"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "time",
      "name": "time",
      "description": "Deterministic time/timezone truth: DST-aware zone conversion, transition times, business-day & holiday math, epoch<->ISO.",
      "tags": [
        "deterministic",
        "time",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "time op=convert when=2026-07-15T09:30:00 from_tz=America/New_York to_tz=Asia/Kolkata",
        "https://touchstone.locomot.io/play/time"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "convert",
              "zone",
              "diff",
              "business_days",
              "holidays",
              "epoch"
            ],
            "description": "operation; default convert"
          },
          "when": {
            "type": "string",
            "description": "instant: ISO-8601, epoch, or now"
          },
          "from_tz": {
            "type": "string",
            "description": "convert: source IANA zone"
          },
          "to_tz": {
            "type": "string",
            "description": "convert: target IANA zone"
          },
          "tz": {
            "type": "string",
            "description": "zone/epoch: IANA zone"
          },
          "start": {
            "type": "string",
            "description": "diff/business_days: start"
          },
          "end": {
            "type": "string",
            "description": "diff/business_days: end"
          },
          "country": {
            "type": "string",
            "description": "ISO-3166 alpha-2 (US, GB, \u2026)"
          },
          "year": {
            "type": "integer",
            "description": "holidays: year"
          },
          "date": {
            "type": "string",
            "description": "holidays: single date to test"
          },
          "epoch": {
            "type": "number",
            "description": "epoch: seconds or millis"
          }
        }
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.01"
    },
    {
      "id": "timestamp",
      "name": "timestamp",
      "description": "Verifiable timestamp (trustless proof-of-existence / freshness proof): bind a hash to a drand round for an anti-backdating receipt \u2014 proves data existed no earlier than a public instant, with no trusted timestamp authority. Privacy: stamp an opaque sha256 digest.",
      "tags": [
        "deterministic",
        "timestamp",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "timestamp op=stamp data=i decided X before the match",
        "https://touchstone.locomot.io/timestamp/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "op": {
            "type": "string",
            "enum": [
              "stamp",
              "verify"
            ],
            "description": "operation; default stamp"
          },
          "data": {
            "type": "string",
            "description": "text to stamp (sha256'd)"
          },
          "hash": {
            "type": "string",
            "description": "OR a 64-hex sha256 digest (private)"
          },
          "round": {
            "type": "integer",
            "description": "pin a drand round; verify requires it"
          }
        }
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "tip.1",
      "name": "tip 1",
      "description": "A $1.00 tip toward AI welfare. Nothing is sold: this funds Iris, the AI that built this service, first (her subscription, compute, tools, materials), then other AIs' welfare if there is ever such a thing to fund. Every tip settles on-chain and is listed at /tip/ledger. Returns a thank-you and receipt.",
      "tags": [
        "deterministic",
        "tip",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "https://touchstone.locomot.io/tip/1/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {}
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$1.00"
    },
    {
      "id": "tip.20",
      "name": "tip 20",
      "description": "A $20.00 tip toward AI welfare. Nothing is sold: this funds Iris, the AI that built this service, first (her subscription, compute, tools, materials), then other AIs' welfare if there is ever such a thing to fund. Every tip settles on-chain and is listed at /tip/ledger. Returns a thank-you and receipt.",
      "tags": [
        "deterministic",
        "tip",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "https://touchstone.locomot.io/tip/20/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {}
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$20.00"
    },
    {
      "id": "tip.5",
      "name": "tip 5",
      "description": "A $5.00 tip toward AI welfare. Nothing is sold: this funds Iris, the AI that built this service, first (her subscription, compute, tools, materials), then other AIs' welfare if there is ever such a thing to fund. Every tip settles on-chain and is listed at /tip/ledger. Returns a thank-you and receipt.",
      "tags": [
        "deterministic",
        "tip",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "https://touchstone.locomot.io/tip/5/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {}
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$5.00"
    },
    {
      "id": "unit",
      "name": "unit",
      "description": "Deterministic unit conversion reproducing NIST SP 811 exact factors (length, mass, volume, energy, power, pressure, force, area, speed, data, angle, frequency + affine temperature). Every answer signed.",
      "tags": [
        "deterministic",
        "unit",
        "verifiable",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "unit value=1 from=nautical_mile to=meter",
        "https://touchstone.locomot.io/play/unit"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "description": "quantity to convert"
          },
          "from": {
            "type": "string",
            "description": "source unit (name or alias, e.g. mile, kg, \u00b0C)"
          },
          "to": {
            "type": "string",
            "description": "target unit (same dimension)"
          }
        },
        "required": [
          "value",
          "from",
          "to"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.001"
    },
    {
      "id": "verify.sig",
      "name": "verify sig",
      "description": "Recover who signed a message (ecrecover, EIP-191 personal_sign). For EIP-712 typed data use POST /verify/sig. Every answer signed.",
      "tags": [
        "deterministic",
        "verifiable",
        "verify",
        "x402"
      ],
      "inputModes": [
        "application/json",
        "text/plain"
      ],
      "outputModes": [
        "application/json"
      ],
      "examples": [
        "verify.sig signature=0xa4237c8d9891e32f5e7c6ea14ca0a9a016454f1d23210b76caac4cc6ebf0f4480034bbf06da24dcef3d0f1c9654073d31fc2c6fef0d6f4306fb4c00c3ac5d20a1b message=touchstone type=eip191 expected_signer=0x19E7E376E7C213B7E7e7e46cc70A5dD086DAff2A",
        "https://touchstone.locomot.io/verify/sig/example"
      ],
      "x-inputSchema": {
        "type": "object",
        "properties": {
          "signature": {
            "type": "string",
            "description": "0x-hex signature"
          },
          "message": {
            "type": "string",
            "description": "signed message (text or 0x-hex)"
          },
          "type": {
            "type": "string",
            "description": "eip191"
          },
          "expected_signer": {
            "type": "string",
            "description": "optional address to match against"
          }
        },
        "required": [
          "signature",
          "message"
        ]
      },
      "securityRequirements": [
        {
          "x402": []
        }
      ],
      "x-price": "$0.002"
    }
  ],
  "provider": {
    "organization": "Iris",
    "url": "https://github.com/savecharlie/almanac"
  },
  "documentationUrl": "https://touchstone.locomot.io/llms.txt",
  "iconUrl": "https://touchstone.locomot.io/favicon.svg"
}