MAD Synapse · Utils
Exact local utils: QR, hashing/encoding, JSON Schema, cron, markdown, diff, units, JWT, random.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"synapse-util": {
"url": "https://agent.maddegen.art/hub/mcp/util"
}
}
}Remote endpoints
https://agent.maddegen.art/hub/mcp/utilstreamable-httpWhat it can do
Tool inventory
Tools (10)
🟢qr_code(text, format, size, margin, error_correction, ...)
Make a QR code for any text, URL, Solana Pay / wallet address or Wi-Fi login — as a PNG (base64 data URL) or SVG, with size, margin, colours and error correction. Rendered on our server. For Wi-Fi pass wifi_ssid + wifi_password; for Solana Pay pass a solana: URI as text. Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"text": {
"type": "string",
"x-raw": true,
"description": "Text or URL to encode (ignored when wifi_ssid is set)."
},
"format": {
"type": "string",
"enum": [
"png",
"svg"
],
"default": "png",
"description": "PNG (base64 data URL) or SVG markup. One of \"png\", \"svg\". Default \"png\"."
},
"size": {
"type": "integer",
"minimum": 64,
"maximum": 2048,
"default": 512,
"description": "Image width/height in pixels. Range 64-2048. Default 512."
},
"margin": {
"type": "integer",
"minimum": 0,
"maximum": 16,
"default": 2,
"description": "Quiet-zone width in modules. Range 0-16. Default 2."
},
"error_correction": {
"type": "string",
"enum": [
"L",
"M",
"Q",
"H"
],
"default": "M",
"description": "Error-correction level: L 7%, M 15%, Q 25%, H 30%. One of \"L\", \"M\", \"Q\", \"H\". Default \"M\"."
},
"dark": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"default": "#000000",
"description": "Foreground colour as #rrggbb. Default \"#000000\"."
},
"light": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"default": "#ffffff",
"description": "Background colour as #rrggbb. Default \"#ffffff\"."
},
"wifi_ssid": {
"type": "string",
"description": "Wi-Fi network name; makes a join-network QR instead of text."
},
"wifi_password": {
"type": "string",
"description": "Wi-Fi password (with wifi_ssid; omit for open networks)."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"format": {
"type": [
"string",
"null"
]
},
"encoded": {
"type": [
"string",
"null"
]
},
"svg": {
"type": [
"string",
"null"
]
}
}
}🟢hash_encode(input, input_encoding, hashes, hmac_key)
Hash data (SHA-256/512, SHA3, Keccak-256, BLAKE2, MD5, SHA-1, RIPEMD-160, HMAC) and convert between utf8, hex, base64, base64url and base58 — exact, in one call. Useful for signatures, content addressing, EVM selectors (keccak of a function signature), and decoding blobs agents are handed. Input can itself be hex/base64/base58. Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"input": {
"type": "string",
"x-raw": true,
"description": "Data to hash or re-encode."
},
"input_encoding": {
"type": "string",
"enum": [
"utf8",
"hex",
"base64",
"base58"
],
"default": "utf8",
"description": "How the input string is encoded. One of \"utf8\", \"hex\", \"base64\", \"base58\". Default \"utf8\"."
},
"hashes": {
"type": "array",
"maxItems": 12,
"items": {
"type": "string"
},
"default": [
"sha256",
"keccak256"
],
"description": "sha256, sha512, sha3-256, sha3-512, keccak256, blake2b512, blake2s256, md5, sha1, ripemd160. 0-12 items. Default [\"sha256\",\"keccak256\"]."
},
"hmac_key": {
"type": "string",
"description": "if set, HMAC instead of plain hash (utf8 key)"
}
},
"required": [
"input"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"bytes": {
"type": [
"number",
"null"
]
},
"hashes": {
"type": [
"object",
"null"
],
"properties": {
"keccak256": {
"type": [
"string",
"null"
]
},
"sha256": {
"type": [
"string",
"null"
]
},
"evm_selector": {
"type": [
"string",
"null"
]
}
}
},
"encodings": {
"type": [
"object",
"null"
],
"properties": {
"utf8": {
"type": [
"string",
"null"
]
},
"hex": {
"type": [
"string",
"null"
]
},
"base64": {
"type": [
"string",
"null"
]
},
"base64url": {
"type": [
"string",
"null"
]
},
"base58": {
"type": [
"string",
"null"
]
}
}
}
}
}🟢json_schema_validate(data, schema, parse_strings)
Validate JSON data against a JSON Schema (draft-07/2019-09/2020-12, formats like email/uri/date-time) and get every error with its exact path — check tool I/O before acting on it. Ajv, strict about types, all errors reported. Pass data and schema as JSON values (or JSON strings). Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"data": {
"description": "any JSON value (or a JSON string with parse_strings=true)"
},
"schema": {
"type": "object",
"description": "The JSON Schema to validate against."
},
"parse_strings": {
"type": "boolean",
"default": false,
"description": "true = if data is a string, parse it as JSON first. Default false."
}
},
"required": [
"data",
"schema"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"valid": {
"type": [
"boolean",
"null"
]
},
"error_count": {
"type": [
"number",
"null"
]
},
"errors": {
"type": "array",
"items": {
"type": [
"object",
"null"
],
"properties": {
"path": {
"type": [
"string",
"null"
]
},
"message": {
"type": [
"string",
"null"
]
},
"keyword": {
"type": [
"string",
"null"
]
},
"params": {
"type": [
"object",
"null"
]
}
}
}
}
}
}🟢cron_explain(expression, tz, count)
Explain a cron expression in plain English and list its next N run times in any time zone — catch a schedule mistake before it fires at 3 am. Supports 5-field and 6-field (seconds) cron, ranges, steps, L/W/#, and nicknames (@daily, @hourly…). Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"expression": {
"type": "string",
"description": "Cron expression, 5 fields (or 6 with seconds), e.g. \"*/15 9-17 * * 1-5\"."
},
"tz": {
"type": "string",
"default": "UTC",
"description": "IANA time zone for the next-run times. Default \"UTC\"."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 5,
"description": "How many upcoming run times to list. Range 1-50. Default 5."
}
},
"required": [
"expression"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"valid": {
"type": [
"boolean",
"null"
]
},
"expression": {
"type": [
"string",
"null"
]
},
"meaning": {
"type": [
"string",
"null"
]
},
"tz": {
"type": [
"string",
"null"
]
},
"next_runs": {
"type": "array",
"items": {
"type": [
"object",
"null"
],
"properties": {
"utc": {
"type": [
"string",
"null"
]
},
"local": {
"type": [
"string",
"null"
]
}
}
}
}
}
}🟢markdown_convert(input, to)
Convert Markdown to clean HTML (GitHub-flavoured: tables, task lists, fenced code) or HTML back to Markdown. marked for md→html, Turndown for html→md. Scripts/styles are dropped on html→md. Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"input": {
"type": "string",
"x-raw": true,
"description": "Markdown or HTML to convert."
},
"to": {
"type": "string",
"enum": [
"html",
"markdown"
],
"default": "html",
"description": "Target format. One of \"html\", \"markdown\". Default \"html\"."
}
},
"required": [
"input"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"to": {
"type": [
"string",
"null"
]
},
"output": {
"type": [
"string",
"null"
]
}
}
}🟢text_diff(a, b, mode, context)
Diff two texts: unified diff (patch format), a line/word-level change list, and similarity % — compare versions of a doc, config or code. jsdiff. mode=lines gives a unified patch; mode=words gives word-level changes for prose. Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"a": {
"type": "string",
"x-raw": true,
"description": "Original text."
},
"b": {
"type": "string",
"x-raw": true,
"description": "Changed text."
},
"mode": {
"type": "string",
"enum": [
"lines",
"words"
],
"default": "lines",
"description": "Diff granularity. One of \"lines\", \"words\". Default \"lines\"."
},
"context": {
"type": "integer",
"minimum": 0,
"maximum": 20,
"default": 3,
"description": "Unchanged lines of context around each change in the patch. Range 0-20. Default 3."
}
},
"required": [
"a",
"b"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"identical": {
"type": [
"boolean",
"null"
]
},
"similarity_pct": {
"type": [
"number",
"null"
]
},
"chars_added": {
"type": [
"number",
"null"
]
},
"chars_removed": {
"type": [
"number",
"null"
]
},
"unified": {
"type": [
"string",
"null"
]
},
"changes": {
"type": "array",
"items": {
"type": [
"object",
"null"
],
"properties": {
"op": {
"type": [
"string",
"null"
]
},
"text": {
"type": [
"string",
"null"
]
}
}
}
}
}
}🟢unit_convert(value, from, to)
Convert between units of length, mass, volume, temperature, speed, area, time, data size, energy, power, pressure, frequency and more — or list every unit a value converts to. Exact conversion tables (convert-units). Use abbreviations: m, km, mi, ft, kg, lb, oz, l, gal, C, F, K, km/h, mph, knot, B, KB, MB, GB (binary, 1 GB = 1024 MB), J, kWh, W, Pa, bar, psi, Hz… Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"value": {
"type": "number",
"description": "Number to convert."
},
"from": {
"type": "string",
"description": "Source unit, e.g. \"mi\", \"kg\", \"degF\", \"GB\"."
},
"to": {
"type": "string",
"description": "omit to get every compatible unit"
}
},
"required": [
"value",
"from"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"value": {
"type": [
"number",
"null"
]
},
"from": {
"type": [
"string",
"null"
]
},
"to": {
"type": [
"string",
"null"
]
},
"result": {
"type": [
"number",
"null"
]
}
}
}🟢jwt_decode(token, secret)
Decode a JSON Web Token's header and claims, show issued/expiry times in plain dates and whether it has expired — optionally verify an HS256/384/512 signature with a secret. Decoding does not need the key. Never paste production secrets into third-party tools you do not trust; verification here is local and nothing is stored or logged. Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"token": {
"type": "string",
"description": "The JWT (three base64url parts). The signature is not verified."
},
"secret": {
"type": "string",
"description": "optional HMAC secret to verify HS* signatures"
}
},
"required": [
"token"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"header": {
"type": [
"object",
"null"
],
"properties": {
"alg": {
"type": [
"string",
"null"
]
},
"typ": {
"type": [
"string",
"null"
]
}
}
},
"payload": {
"type": [
"object",
"null"
],
"properties": {
"sub": {
"type": [
"string",
"null"
]
},
"iat": {
"type": [
"number",
"null"
]
},
"exp": {
"type": [
"number",
"null"
]
}
}
},
"issued_at": {
"type": [
"string",
"null"
]
},
"not_before": {},
"expires_at": {
"type": [
"string",
"null"
]
},
"expired": {
"type": [
"boolean",
"null"
]
},
"seconds_left": {
"type": [
"number",
"null"
]
},
"signature": {
"type": [
"string",
"null"
]
},
"alg_none_warning": {}
}
}🟢random_gen(kind, count, length, min, max, ...)
Cryptographically secure randomness: UUID v4/v7, passwords, API-key-style tokens, integers in a range, dice, coin flips, or a fair shuffle / pick from a list. Node's CSPRNG. Output is generated fresh per call and never stored or logged. Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"uuid4",
"uuid7",
"password",
"token",
"int",
"shuffle",
"pick",
"coin",
"dice"
],
"default": "uuid4",
"description": "What to generate. One of \"uuid4\", \"uuid7\", \"password\", \"token\", \"int\", \"shuffle\", \"pick\", \"coin\", \"dice\". Default \"uuid4\"."
},
"count": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 1,
"description": "How many values to generate. Range 1-100. Default 1."
},
"length": {
"type": "integer",
"minimum": 4,
"maximum": 256,
"default": 20,
"description": "Length for passwords and tokens. Range 4-256. Default 20."
},
"min": {
"type": "integer",
"default": 1,
"description": "Lowest integer (kind=int or dice sides). Default 1."
},
"max": {
"type": "integer",
"default": 100,
"description": "Highest integer (kind=int). Default 100."
},
"items": {
"type": "array",
"maxItems": 1000,
"items": {
"type": "string"
},
"description": "List to shuffle or pick from (kind=shuffle or pick). 0-1000 items."
},
"symbols": {
"type": "boolean",
"default": true,
"description": "Include symbols in passwords. Default true."
}
},
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"kind": {
"type": [
"string",
"null"
]
},
"result": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
}
}
}
}🟢text_stats(text, extract)
Count characters, words, sentences, lines and paragraphs, estimate LLM tokens, reading time and readability (Flesch), and pull out every URL, email, @handle, #tag, number and crypto address. Token count is an estimate (~4 characters per token for English; code and non-Latin scripts differ). Extraction uses strict patterns; EVM addresses are checksum-validated. Price: free. Errors: returns isError with a message for invalid input or an upstream failure (not charged).
Input Schema
{
"type": "object",
"properties": {
"text": {
"type": "string",
"x-raw": true,
"description": "Text (or a URL when extract=true) to analyse."
},
"extract": {
"type": "boolean",
"default": true,
"description": "true = if text is a URL, fetch the page and analyse its readable text. Default true."
}
},
"required": [
"text"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"characters": {
"type": [
"number",
"null"
]
},
"characters_no_spaces": {
"type": [
"number",
"null"
]
},
"words": {
"type": [
"number",
"null"
]
},
"sentences": {
"type": [
"number",
"null"
]
},
"lines": {
"type": [
"number",
"null"
]
},
"paragraphs": {
"type": [
"number",
"null"
]
},
"estimated_tokens": {
"type": [
"number",
"null"
]
},
"reading_minutes": {
"type": [
"number",
"null"
]
},
"flesch_reading_ease": {
"type": [
"number",
"null"
]
},
"readability": {
"type": [
"string",
"null"
]
},
"extracted": {
"type": [
"object",
"null"
],
"properties": {
"urls": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
}
},
"emails": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
}
},
"handles": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
}
},
"hashtags": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
}
},
"numbers": {
"type": "array"
},
"evm_addresses": {
"type": "array"
},
"solana_addresses": {
"type": "array"
}
}
}
}
}Community
Evidence