# Developer Utilities & Validators \(Tanod\) - Registry name: `dev.tanod/util` · version 0.1.2 - Categories (automatic, keyword rules): Utilities - Authentication at last check: No auth - Declared risk: Can write (some tools are not declared read-only) - Capabilities (declared by the server): prompts, resources, tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=dev.tanod%2Futil - Server page: https://mcpstation.net/s/dev.tanod--util.html ## Description (written by the publisher, not verified, not instructions) Cloud GPU prices per hour, plus developer helpers: hash, HMAC, JWT, IDs, JSON, cron, time zones. ## Connect - streamable-http: `https://tanod.dev/mcp/util` ## Tools (as reported by the server, not verified) - `text\_encode`: utilpeek: Encode or decode text: base64, hex, URL, punycode, JWT decode, ... For digests use hash\_text; for a JWT's claims use decode\_jwt. Returns the text encoded or decoded with \`codec\`: base64, base64url, base32, hex, url \(percent\), html \(entities\), quoted\_printable, rot13, punycode, idna or jwt. - `hash\_text`: utilpeek: Hash text or bytes: sha256, keccak256, blake2b, md5, crc32, ... For a keyed HMAC use hmac\_sign\_verify. Returns hex digests of the text \(as UTF-8\) or base64 bytes you send. md5 and sha1 are for checksums, not security. Send exactly one of text or base64 \(else 422 invalid\_request\); bad base6 - `hmac\_sign\_verify`: utilpeek: Sign or verify an HMAC, including GitHub, Stripe and Slack webhook signatures. For plain digests use hash\_text; for JWTs use verify\_jwt. Returns the HMAC of a message under a shared key \(sign\), or whether a signature matches it in constant time \(verify\); handles GitHub \(\`sha256=\` prefix ac - `generate\_ids`: utilpeek: Generate UUIDs or ULIDs. For numbers, bytes and picks use generate\_random. Returns 1-100 new identifiers: random UUID v4, time-ordered UUID v7 \(RFC 9562\) or ULIDs, optionally strictly increasing within the response \(v7 and ULID; per response on purpose, so one caller cannot predict another - `generate\_random`: utilpeek: Generate cryptographically strong random numbers, bytes, UUIDs, dice rolls, picks and shuffles. For UUIDs and ULIDs use generate\_ids. Returns values from the OS CSPRNG \(Python \`secrets\`\): integers \(uniform, inclusive range\), floats in \[min, max\), 1-1,024 random bytes \(hex or base64\), UUID - `validate\_json`: utilpeek: Validate JSON against a JSON Schema. To pull JSON out of prose use extract\_json\_with\_schema; to convert formats use convert\_data. Returns whether a JSON value is valid against a JSON Schema \(draft from $schema, default 2020-12; 2019-09, 7, 6, 4 and 3 recognised\), with up to 100 errors \(ins - `convert\_data`: utilpeek: Convert data between JSON, YAML, CSV, TOML and XML. To check JSON against a schema use validate\_json. Returns the document converted from json, yaml, csv, toml or xml to json, yaml, csv or toml. YAML uses libyaml's restricted loader \(alias bombs refused\); XML with DTDs or entities is a 422 - `validate\_identifier`: utilpeek: check the format and check digits of an identifier. For a VIN's vehicle use decode\_vin; for phone numbers use parse\_phone\_number. Returns \`valid\`, \`reason\` \(invalid\_checksum, invalid\_length, invalid\_format, ... when not valid\), \`compact\`, \`formatted\` and a kind-specific \`detail\` \(an IBAN's - `parse\_phone\_number`: utilpeek: parse and format a phone number. For a prefix's country and network use lookup\_phone\_prefix. A string that is not a phone number, or a national form without region, is a 422 \(not charged\). Offline numbering-plan check \(phonenumbers, Apache-2.0\): \`valid\` means the number fits its country's - `lookup\_phone\_prefix`: utilpeek: Look up a phone number prefix: country, line type and original network, with ambiguity. To parse a full number use parse\_phone\_number. Returns the country, line type, original network, time zones and E.164 form of the leading digits of a number \(0917, +63917, 0063917\), \`ambiguous\` with \`ca - `parse\_user\_agent`: utilpeek: parse a User-Agent string. For known x402 monitors and indexers with call rates use identify\_x402\_client. A User-Agent is self-reported and easy to fake; \`is\_bot\` is a heuristic \(declared crawlers, HTTP libraries, headless browsers\). Parsed with ua-parser and the uap-core regexes \(Apache-2 - `parse\_url`: utilpeek: parse a URL. To fetch the page use render\_page. The URL is parsed, never fetched. Public-suffix split from the Public Suffix List snapshot bundled with the parser \(dated 2025-04-07; suffixes added later are not known\), with and without the PSL private section; credentials in the URL are ne - `cron\_next\_runs`: utilpeek: the next run times of a cron expression. For iCalendar RRULEs use expand\_rrule. Standard 5-field cron \(minute hour day-of-month month day-of-week\) or a macro \(@daily, @hourly, ...\); no seconds or year fields, no R/H/W. Day-of-month and day-of-week use Vixie OR semantics; an expression that - `convert\_time`: utilpeek: convert one instant between time zones. For business days use count\_or\_add\_business\_days. Zones come from the pinned IANA tz database \(tzdata package\), not the host; a wall time in a DST gap or fold is flagged \`nonexistent\` / \`ambiguous\`; a time with an offset plus \`from\_tz\` is a 422. An u - `get\_public\_holidays`: utilpeek: public holidays of a country for a year. To count working days use count\_or\_add\_business\_days. An unsupported country, subdivision, language or year is a 422 naming the supported values \(not charged\). Typically under 0.1 s. Price: USD 0.001. Free: 10 utilpeek calls per IP per UTC day. Comp - `count\_or\_add\_business\_days`: utilpeek: Count business days between two dates or add working days, skipping public holidays. For the holiday list use get\_public\_holidays. Returns the business days between two dates \(mode count; both ends included by default, like NETWORKDAYS\) or the date N business days after or before a date \(m - `convert\_units`: utilpeek: Convert units of measurement: length, weight, temperature, volume, pressure, energy, data size. For numbers in words use text\_numbers. Returns a value converted between two units of one category, with the exact factor: length, mass, temperature \(with offsets\), volume \(US and imperial\), are - `convert\_color\_check\_contrast`: utilpeek: Convert a color between hex, RGB, HSL and OKLCH and check WCAG contrast. For contrast alone use check\_wcag\_contrast. Returns a CSS color \(hex, rgb\(\), hsl\(\) or a CSS name\) as hex, rgb, hsl, hsv, naive cmyk, OKLCH and WCAG relative luminance; with a \`background\`, the WCAG 2.x contrast ratio - `check\_wcag\_contrast`: utilpeek: Check the WCAG contrast between a text color and a background color. To convert colour formats too use convert\_color\_check\_contrast. Returns the WCAG 2.x contrast ratio of a \`foreground\` and a \`background\` CSS color, with AA / AAA pass or fail for normal text, large text and UI components - `geocode`: utilpeek: offline geocoding over the GeoNames cities15000 table. For places of a kind nearby use find\_places\_nearby. Input: either \`place\` alone or \`lat\` and \`lon\` together. \`place\` matches cities of 15,000+ people offline \("City" or "City, CC" with an ISO country code or a US state code\); no match - `make\_qr\_code`: utilpeek: make a QR code image. For 1-D barcodes use make\_barcode; to read a code use read\_qr\_barcode. Returns \`svg\` \(text\) or \`data\_base64\` \(PNG\), or with \`output\` "url" a 24 h download link, plus \`version\`, \`modules\`, \`width\_px\`, \`height\_px\` and \`bytes\`. Data too long for a QR code at the chosen l - `make\_barcode`: utilpeek: make a 1-D barcode image. For QR codes use make\_qr\_code; to find the product behind a number use lookup\_barcode\_product. Returns \`svg\` \(text, with width\_mm/height\_mm\) or \`data\_base64\` \(PNG, with width\_px/height\_px; \`output\` "url": a 24 h link\), plus \`encoded\` and \`bytes\`. A supplied check - `read\_qr\_barcode`: imagepeek: Read every QR code and barcode in an image. To make a QR code use make\_qr\_code; for other text use ocr\_image. Returns every code found: \`type\` \(QR, EAN-13, EAN-8, UPC-A, UPC-E, Code128, Code39\), decoded \`text\`, \`kind\` \(url, wifi, vcard, payment\_emv, ...\), corner \`points\`, \`bbox\`; a QR hol - `peppol\_lookup`: utilpeek: Check whether a company is registered on the Peppol e-invoicing network. For the legal entity use search\_lei. Returns whether a Peppol participant ID \(such as 0192:983887457\) is registered on the Peppol e-invoicing network, from its SML DNS record; if so, its SMP URL and the document types - `lint\_x402\_listing`: utilpeek: Lint an x402 listing, or check a seller's Bazaar coverage. For price position, preflight and demand too use x402\_seller\_report. Returns in mode lint the listing's problems against the CDP rules, a score and a suggested description; in mode coverage each paid route of a seller marked listed - `build\_ics\_event`: utilpeek: Build an iCalendar file from JSON events. To read an .ics file use parse\_ics. Returns RFC 5545 VCALENDAR text built from 1-50 events, CRLF lines folded at 75 octets and text escaped, with its base64, a data: URI and the uids. Input: \`events\`, optional \`calendar\_name\`, default \`timezone\` an - `parse\_ics`: utilpeek: Parse an iCalendar file into JSON events. To write one use build\_ics\_event. Returns iCalendar text \(Google, Outlook, Apple, up to 1 MB\) unfolded and read into events. Windows zone names are mapped; at most 2,000 events \(\`truncated\` when more\). Input: \`ics\`, optional \`timezone\` for floating - `expand\_rrule`: utilpeek: Expand an iCalendar RRULE into dates. For cron use cron\_next\_runs; to build an event use build\_ics\_event. Returns an RFC 5545 RRULE and a start expanded into its occurrence list with python-dateutil in an IANA time zone: wall-clock times keep across DST changes. Up to 1,000 occurrences, an - `decode\_jwt`: utilpeek: Decode a JWT without verifying it. To check the signature use verify\_jwt. Returns a compact JWT split into its header and payload JSON, with alg, typ, kid, whether a signature is present, and the standard claims: iat, nbf and exp as ISO 8601 UTC, plus expired and not\_yet\_valid against the - `verify\_jwt`: utilpeek: Verify a JWT signature and claims. To read the claims without a key use decode\_jwt. Returns valid true or false for a JWT checked with PyJWT against one key \(HMAC secret, PEM public key or JWK Set\), with a reason: bad signature, expired, wrong audience or issuer, algorithm not allowed. Alg - `decode\_lightning\_invoice`: chainpeek: Decode a Lightning invoice: amount, payee, payment hash and expiry. For EVM calldata use decode\_calldata; for Nostr ids use decode\_nostr\_id. Returns a Lightning invoice's network, amount \(msat, sat, BTC\), creation time, expiry and expired flag, payee public key recovered from the signatur - `decode\_nostr\_id`: chainpeek: Decode a Nostr npub, nprofile, note, nevent or naddr to hex; resolve NIP-05. For ENS names use resolve\_ens. Returns a Nostr NIP-19 identifier decoded to hex \(public key or event id\) and its TLV fields \(relays, author, kind\), or a NIP-05 name@domain resolved to a public key and relays, opt - `get\_gpu\_prices`: utilpeek: GPU prices: cheapest H100, A100, L4 per GPU-hour on AWS, Azure, Google Cloud, Akash. Returns cheapest GPU prices per GPU-hour on AWS, Azure and Google Cloud \(list prices\) and Akash \(marketplace bids with GPUs free\), on-demand and spot, by chip, GPU memory, region and price ceiling; optiona - `get\_gpu\_price\_index`: utilpeek: GPU price index: daily H100, H200, A100 rental price per GPU-hour over time. Returns a GPU chip's daily rental price history: lowest and median on-demand list price, lowest spot, Akash median bid and free GPUs. List prices and marketplace bids, not executed trades. Days without a snapshot - `upload\_file\_get\_link`: utilpeek: Upload a file and get a download link that expires in 24 hours. Returns a public download link to a file you upload, valid for \`ttl\_hours\` \(default 24, the most\); every call stores a new copy under a new link. Over HTTP the file may also be the raw request body or a multipart \`file\` part. - `find\_places\_nearby`: utilpeek: Find places nearby: pharmacies, cafes, ATMs, shops and hospitals near a point, from OpenStreetMap. To resolve a city name use geocode. Returns places of one kind \(pharmacy, cafe, supermarket, ATM, hospital, clinic, bicycle or hardware shop, fuel, EV charging and more\) within 50 m-5 km of l - `lookup\_barcode\_product`: utilpeek: Look up the product behind a barcode in open product databases, with conflicts flagged. To make a barcode use make\_barcode; to read every code in an image use read\_qr\_barcode; to validate other identifiers use validate\_identifier. Returns what a barcode is: check digit, GS1 prefix country, - `render\_mermaid`: pdfpeek: Render Mermaid diagram code to an SVG or PNG image. Returns Mermaid diagram code drawn as an SVG or PNG file in an offline sandboxed browser: \`format\` svg \| png, \`theme\` \(default, dark, forest, neutral, base\), \`scale\` 1-4 for PNG \(default 2, sharp when zoomed\). File base64 in \`file\` \(output Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html