{"name":"touchstone","description":"Verified-reality oracle for agents: deterministic, signed answers to the facts an agent cannot afford to get wrong — 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-10","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`) — 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 — 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 — 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 — 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 — 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 — 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 — 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 — 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, …)"},"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.001"},{"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 — 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":"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, °C)"},"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"}