{
  "x402Version": 2,
  "name": "Keyronne agent services",
  "description": "Small, stateless, pay-per-call HTTP APIs for AI agents. Each endpoint returns an x402 payment quote (HTTP 402) when called without an X-PAYMENT header; pay in USDC and retry to get the result. No accounts, no API keys.",
  "payments": {
    "protocol": "x402",
    "x402Version": 2,
    "network": "base",
    "caip2": "eip155:8453",
    "currency": "USDC"
  },
  "services": [
    {
      "name": "validate-json",
      "serviceName": "JSON Schema Validator",
      "resource": "https://homepage-efl.pages.dev/api/validate-json",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Validate a JSON value against a JSON Schema and coerce common LLM-output mistakes (numbers as strings, stringified booleans, scalars where arrays are expected, missing defaults, extra properties). Returns the coerced value plus a structured error report. Built for cleaning up LLM tool-call arguments and structured outputs. POST a JSON body like: {\"schema\":{\"type\":\"object\",\"required\":[\"name\",\"age\"],\"properties\":{\"name\":{\"type\":\"string\"},\"age\":{\"type\":\"integer\"}}},\"data\":{\"name\":\"Ada\",\"age\":\"36\"}}",
      "tags": [
        "json",
        "validation",
        "llm-outputs",
        "coercion",
        "schema"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "schema",
          "data"
        ],
        "properties": {
          "schema": {
            "type": "object",
            "description": "JSON Schema (draft-07 style subset: type, properties, required, items, enum, const, additionalProperties, min/max constraints, pattern, default)."
          },
          "data": {
            "description": "The candidate JSON value to validate and coerce."
          },
          "coerce": {
            "type": "boolean",
            "default": true,
            "description": "Attempt type coercion and default-filling before validating."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "value": {
            "description": "The (possibly coerced) value."
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "path": {
                  "type": "string"
                },
                "message": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "exampleInput": {
        "schema": {
          "type": "object",
          "required": [
            "name",
            "age"
          ],
          "properties": {
            "name": {
              "type": "string"
            },
            "age": {
              "type": "integer"
            }
          }
        },
        "data": {
          "name": "Ada",
          "age": "36"
        }
      }
    },
    {
      "name": "markdown",
      "serviceName": "Web to Markdown",
      "resource": "https://homepage-efl.pages.dev/api/markdown",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.005",
      "description": "Convert a web page (by URL) or raw HTML into clean, readable Markdown plus structured metadata (title, description, Open Graph tags, canonical URL, language). Strips scripts, styles and boilerplate tags; preserves headings, links, images, lists, code blocks and tables. Built for agents that need web content as LLM-ready text. POST a JSON body like: {\"url\":\"https://example.com/article\"}",
      "tags": [
        "markdown",
        "html",
        "scraping",
        "content",
        "metadata"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "description": "Public http(s) URL to fetch and convert (max 2 MB, private networks blocked). Provide either url or html."
          },
          "html": {
            "type": "string",
            "description": "Raw HTML to convert. Provide either url or html."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "source": {
            "type": "string",
            "description": "Final URL after redirects, or \"inline\"."
          },
          "metadata": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "canonical": {
                "type": "string"
              },
              "lang": {
                "type": "string"
              },
              "og": {
                "type": "object"
              }
            }
          },
          "markdown": {
            "type": "string"
          },
          "truncated": {
            "type": "boolean"
          }
        }
      },
      "exampleInput": {
        "url": "https://example.com/article"
      }
    },
    {
      "name": "similarity",
      "serviceName": "Text Similarity + Dedup",
      "resource": "https://homepage-efl.pages.dev/api/similarity",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.002",
      "description": "Compute pairwise text similarity, find near-duplicates, and cluster a batch of texts (2–300 items). Character n-gram cosine similarity: language-agnostic, robust to small edits, no model calls. Returns similar pairs above a threshold, connected-component clusters, and the full matrix for small batches. POST a JSON body like: {\"texts\":[\"hello world\",\"hello world!\",\"unrelated\"],\"threshold\":0.8}",
      "tags": [
        "similarity",
        "dedup",
        "clustering",
        "text",
        "nlp"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "texts"
        ],
        "properties": {
          "texts": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 2,
            "maxItems": 300,
            "description": "Texts to compare (each up to 20,000 characters)."
          },
          "threshold": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.8,
            "description": "Similarity threshold for pairs and clustering."
          },
          "ngram": {
            "type": "integer",
            "minimum": 2,
            "maximum": 5,
            "default": 3,
            "description": "Character n-gram size."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer"
          },
          "pairs": {
            "type": "array",
            "description": "Pairs with similarity >= threshold, sorted descending.",
            "items": {
              "type": "object",
              "properties": {
                "a": {
                  "type": "integer"
                },
                "b": {
                  "type": "integer"
                },
                "score": {
                  "type": "number"
                }
              }
            }
          },
          "clusters": {
            "type": "array",
            "description": "Groups of indices connected at the threshold.",
            "items": {
              "type": "array",
              "items": {
                "type": "integer"
              }
            }
          },
          "matrix": {
            "type": "array",
            "description": "Full similarity matrix (only when count <= 50).",
            "items": {
              "type": "array",
              "items": {
                "type": "number"
              }
            }
          }
        }
      },
      "exampleInput": {
        "texts": [
          "hello world",
          "hello world!",
          "unrelated"
        ],
        "threshold": 0.8
      }
    },
    {
      "name": "json-repair",
      "serviceName": "JSON Repair",
      "resource": "https://homepage-efl.pages.dev/api/json-repair",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Repair malformed JSON text into valid parsed JSON: markdown code fences, single quotes, smart quotes, unquoted keys, trailing commas, comments, Python literals (True/None), raw newlines in strings, and truncated output (auto-closes strings, arrays and objects). Returns the parsed value plus a log of every repair applied. Built for LLM output that almost parses. POST a JSON body like: {\"text\":\"```json\\n{name: 'Ada', age: 36, tags: ['x',], active: True\"}",
      "tags": [
        "json",
        "repair",
        "llm-outputs",
        "parsing",
        "malformed"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "The malformed JSON text to repair."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "value": {
            "description": "The repaired, parsed JSON value."
          },
          "repairs": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Human-readable list of repairs applied (empty if input was valid)."
          }
        }
      },
      "exampleInput": {
        "text": "```json\n{name: 'Ada', age: 36, tags: ['x',], active: True"
      }
    },
    {
      "name": "email-validate",
      "serviceName": "Email Validator",
      "resource": "https://homepage-efl.pages.dev/api/email-validate",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Validate email addresses: RFC-style syntax checks, IDN domain normalization, live MX lookups with A/AAAA fallback (DNS-over-HTTPS), disposable-domain detection, role-address detection (info@, support@), free-provider flagging, and typo suggestions for popular providers (gmial.com -> gmail.com). Single address or batches up to 50. POST a JSON body like: {\"emails\":[\"ada@example.com\",\"bad@mailinator.com\",\"typo@gmial.com\"]}",
      "tags": [
        "email",
        "validation",
        "mx",
        "disposable",
        "verification"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "description": "One address to validate. Provide email or emails."
          },
          "emails": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "description": "Batch of addresses to validate (max 50)."
          },
          "skipDns": {
            "type": "boolean",
            "default": false,
            "description": "Skip MX/A lookups and return syntax + heuristic checks only."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "email": {
                  "type": "string"
                },
                "valid": {
                  "type": "boolean"
                },
                "reason": {
                  "type": "string",
                  "description": "Why the address is invalid, if it is."
                },
                "domain": {
                  "type": "string",
                  "description": "Normalized ASCII domain."
                },
                "checks": {
                  "type": "object",
                  "properties": {
                    "disposable": {
                      "type": "boolean"
                    },
                    "role": {
                      "type": "boolean"
                    },
                    "freeProvider": {
                      "type": "boolean"
                    },
                    "hasPlusTag": {
                      "type": "boolean"
                    }
                  }
                },
                "suggestion": {
                  "type": "string",
                  "description": "Likely intended address for typos."
                },
                "dns": {
                  "type": "object",
                  "properties": {
                    "deliverable": {
                      "description": "true/false, or null if DNS was unreachable."
                    },
                    "mxRecords": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    },
                    "method": {
                      "type": "string",
                      "enum": [
                        "MX",
                        "A-fallback",
                        "AAAA-fallback",
                        "unavailable"
                      ]
                    }
                  }
                }
              }
            }
          }
        }
      },
      "exampleInput": {
        "emails": [
          "ada@example.com",
          "bad@mailinator.com",
          "typo@gmial.com"
        ]
      }
    },
    {
      "name": "chunk-text",
      "serviceName": "Text Chunker for RAG",
      "resource": "https://homepage-efl.pages.dev/api/chunk-text",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.002",
      "description": "Split long text into retrieval-ready chunks along natural boundaries — paragraphs, sentences, or markdown sections — with configurable size, overlap, character offsets and approximate token counts per chunk. Deterministic and language-agnostic. Built for RAG ingestion and embedding pipelines. POST a JSON body like: {\"text\":\"Long document...\",\"strategy\":\"paragraphs\",\"maxChars\":2000,\"overlap\":200}",
      "tags": [
        "rag",
        "chunking",
        "embeddings",
        "text-splitting",
        "tokens"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "The text to chunk (up to ~900k characters)."
          },
          "strategy": {
            "type": "string",
            "enum": [
              "paragraphs",
              "sentences",
              "markdown",
              "chars"
            ],
            "default": "paragraphs"
          },
          "maxChars": {
            "type": "integer",
            "minimum": 100,
            "maximum": 50000,
            "default": 2000
          },
          "overlap": {
            "type": "integer",
            "minimum": 0,
            "default": 200,
            "description": "Characters of trailing context carried into the next chunk."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer"
          },
          "totalChars": {
            "type": "integer"
          },
          "totalApproxTokens": {
            "type": "integer"
          },
          "truncated": {
            "type": "boolean",
            "description": "True if the 2000-chunk cap was hit."
          },
          "chunks": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "index": {
                  "type": "integer"
                },
                "start": {
                  "type": "integer"
                },
                "end": {
                  "type": "integer"
                },
                "chars": {
                  "type": "integer"
                },
                "approxTokens": {
                  "type": "integer"
                },
                "text": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "exampleInput": {
        "text": "Long document...",
        "strategy": "paragraphs",
        "maxChars": 2000,
        "overlap": 200
      }
    },
    {
      "name": "diff-text",
      "serviceName": "Text Diff",
      "resource": "https://homepage-efl.pages.dev/api/diff-text",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.002",
      "description": "Compare two texts with a Myers diff over lines, words, or characters. Returns structured edit operations, a standard unified diff (line mode), and similarity statistics. Built for agents tracking document revisions, verifying edits, or reviewing generated changes. POST a JSON body like: {\"a\":\"line one\\nline two\\n\",\"b\":\"line one\\nline 2\\n\",\"mode\":\"lines\"}",
      "tags": [
        "diff",
        "compare",
        "patch",
        "versions",
        "unified-diff"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "a",
          "b"
        ],
        "properties": {
          "a": {
            "type": "string",
            "description": "Original text (up to 300k characters)."
          },
          "b": {
            "type": "string",
            "description": "Modified text (up to 300k characters)."
          },
          "mode": {
            "type": "string",
            "enum": [
              "lines",
              "words",
              "chars"
            ],
            "default": "lines"
          },
          "context": {
            "type": "integer",
            "minimum": 0,
            "maximum": 20,
            "default": 3
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string"
          },
          "identical": {
            "type": "boolean"
          },
          "stats": {
            "type": "object",
            "properties": {
              "added": {
                "type": "integer"
              },
              "removed": {
                "type": "integer"
              },
              "unchanged": {
                "type": "integer"
              },
              "similarity": {
                "type": "number"
              }
            }
          },
          "unified": {
            "type": "string",
            "description": "Unified diff (line mode only)."
          },
          "ops": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "op": {
                  "type": "string",
                  "enum": [
                    "equal",
                    "delete",
                    "insert"
                  ]
                },
                "text": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "exampleInput": {
        "a": "line one\nline two\n",
        "b": "line one\nline 2\n",
        "mode": "lines"
      }
    },
    {
      "name": "weather",
      "serviceName": "Global Weather",
      "resource": "https://homepage-efl.pages.dev/api/weather",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.005",
      "description": "Current conditions plus hourly and daily forecasts for anywhere on Earth. Pass a major city name or lat/lon coordinates; get temperature, wind, humidity, pressure, cloud cover, condition codes and precipitation, with up to 90 hourly and 10 daily entries. Data from MET Norway (CC BY 4.0). No API keys, one call. POST a JSON body like: {\"city\":\"paris\",\"hourly\":12,\"days\":3}",
      "tags": [
        "weather",
        "forecast",
        "temperature",
        "precipitation",
        "wind"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string",
            "description": "Major city name (e.g. \"tokyo\", \"new york\"). Or use lat/lon."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180
          },
          "hourly": {
            "type": "integer",
            "minimum": 0,
            "maximum": 90,
            "default": 24,
            "description": "Hourly entries to return."
          },
          "days": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Daily summaries to return."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "city": {
                "type": "string"
              }
            }
          },
          "updatedAt": {
            "type": "string"
          },
          "units": {
            "type": "object"
          },
          "current": {
            "type": "object",
            "properties": {
              "time": {
                "type": "string"
              },
              "temperatureC": {
                "type": "number"
              },
              "windSpeedMs": {
                "type": "number"
              },
              "windDirectionDeg": {
                "type": "number"
              },
              "humidityPct": {
                "type": "number"
              },
              "pressureHpa": {
                "type": "number"
              },
              "cloudCoverPct": {
                "type": "number"
              },
              "condition": {
                "type": "string",
                "description": "MET symbol code, e.g. \"rain\", \"clearsky_day\"."
              },
              "precipitationNextHourMm": {
                "type": "number"
              }
            }
          },
          "hourly": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "daily": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "attribution": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "city": "paris",
        "hourly": 12,
        "days": 3
      }
    },
    {
      "name": "calc",
      "serviceName": "Exact Math + Units + Stats",
      "resource": "https://homepage-efl.pages.dev/api/calc",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Exact computation LLMs cannot do reliably: evaluate arithmetic expressions (trig, logs, powers, factorials, constants), convert between 80+ units across 11 dimensions (length, mass, temperature, data, speed, energy, pressure...), and compute descriptive statistics (mean, median, stdev, percentiles) over up to 100k numbers. Deterministic, no hallucinated arithmetic. POST a JSON body like: {\"expression\":\"sqrt(2) * sin(pi/4) + 17^2\",\"convert\":{\"value\":100,\"from\":\"mph\",\"to\":\"kmh\"},\"stats\":[1,2,2,3,8]}",
      "tags": [
        "math",
        "calculator",
        "units",
        "statistics",
        "conversion"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "expression": {
            "type": "string",
            "description": "Math expression, e.g. \"sqrt(2)*sin(pi/4)\", \"fact(20) / 2^10\"."
          },
          "convert": {
            "type": "object",
            "properties": {
              "value": {
                "type": "number"
              },
              "from": {
                "type": "string",
                "description": "e.g. \"mph\", \"celsius\", \"GiB\", \"acre\""
              },
              "to": {
                "type": "string"
              }
            }
          },
          "stats": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "description": "Numbers to describe statistically (up to 100,000)."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "expression": {
            "type": "object",
            "properties": {
              "input": {
                "type": "string"
              },
              "value": {
                "type": "number"
              }
            }
          },
          "convert": {
            "type": "object",
            "properties": {
              "value": {
                "type": "number"
              },
              "dimension": {
                "type": "string"
              },
              "from": {
                "type": "string"
              },
              "to": {
                "type": "string"
              }
            }
          },
          "stats": {
            "type": "object",
            "properties": {
              "count": {
                "type": "integer"
              },
              "sum": {
                "type": "number"
              },
              "min": {
                "type": "number"
              },
              "max": {
                "type": "number"
              },
              "mean": {
                "type": "number"
              },
              "median": {
                "type": "number"
              },
              "stdev": {
                "type": "number"
              },
              "variance": {
                "type": "number"
              },
              "p25": {
                "type": "number"
              },
              "p75": {
                "type": "number"
              },
              "p90": {
                "type": "number"
              },
              "p99": {
                "type": "number"
              }
            }
          }
        }
      },
      "exampleInput": {
        "expression": "sqrt(2) * sin(pi/4) + 17^2",
        "convert": {
          "value": 100,
          "from": "mph",
          "to": "kmh"
        },
        "stats": [
          1,
          2,
          2,
          3,
          8
        ]
      }
    },
    {
      "name": "secret",
      "serviceName": "Secret Generator",
      "resource": "https://homepage-efl.pages.dev/api/secret",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Generate cryptographic secrets with CSPRNG randomness and honest entropy accounting: random bytes (hex/base64/base64url), passwords with character-class guarantees, pronounceable strings, UUIDs, prefixed API keys, TOTP seeds (base32), and asymmetric keypairs (Ed25519, ECDSA P-256, RSA-2048) as PEM + JWK. Unbiased rejection sampling. Secrets are never stored or logged. POST a JSON body like: {\"type\":\"password\",\"length\":24,\"symbols\":true,\"count\":2}",
      "tags": [
        "secrets",
        "random",
        "password",
        "keypair",
        "crypto"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "bytes",
              "password",
              "pronounceable",
              "uuid",
              "apikey",
              "totp-secret",
              "keypair"
            ],
            "default": "bytes"
          },
          "count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 1
          },
          "length": {
            "type": "integer",
            "description": "bytes: 1-1024. password: 8-256. pronounceable: 8-64."
          },
          "encoding": {
            "type": "string",
            "enum": [
              "hex",
              "base64",
              "base64url"
            ],
            "description": "For type=bytes."
          },
          "lower": {
            "type": "boolean",
            "default": true,
            "description": "Password character classes..."
          },
          "upper": {
            "type": "boolean",
            "default": true
          },
          "digits": {
            "type": "boolean",
            "default": true
          },
          "symbols": {
            "type": "boolean",
            "default": false
          },
          "excludeAmbiguous": {
            "type": "boolean",
            "default": true
          },
          "prefix": {
            "type": "string",
            "description": "For type=apikey, e.g. \"sk\"."
          },
          "bytes": {
            "type": "integer",
            "description": "For apikey (16-64) and totp-secret (10-64)."
          },
          "algorithm": {
            "type": "string",
            "enum": [
              "ed25519",
              "p256",
              "rsa2048"
            ],
            "description": "For type=keypair."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "secret": {
                  "type": "string"
                },
                "entropyBits": {
                  "type": "integer"
                },
                "privateKeyPem": {
                  "type": "string",
                  "description": "keypair only"
                },
                "publicKeyPem": {
                  "type": "string",
                  "description": "keypair only"
                },
                "privateJwk": {
                  "type": "object"
                },
                "publicJwk": {
                  "type": "object"
                }
              }
            }
          },
          "generatedAt": {
            "type": "string"
          },
          "note": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "type": "password",
        "length": 24,
        "symbols": true,
        "count": 2
      }
    },
    {
      "name": "geocode",
      "serviceName": "Geocoder",
      "resource": "https://homepage-efl.pages.dev/api/geocode",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Forward and reverse geocoding on OpenStreetMap data: turn place names, addresses, and landmarks into coordinates with structured address components (forward), or turn lat/lon into the nearest address (reverse). Global coverage, up to 10 ranked results. ODbL attribution included in every response. POST a JSON body like: {\"query\":\"eiffel tower, paris\",\"limit\":1}",
      "tags": [
        "geocoding",
        "address",
        "coordinates",
        "places",
        "openstreetmap"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Place name or address to geocode (forward). Provide query OR lat+lon."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 90,
            "description": "Reverse geocoding latitude."
          },
          "lon": {
            "type": "number",
            "minimum": -180,
            "maximum": 180,
            "description": "Reverse geocoding longitude."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 3
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "lat": {
                  "type": "number"
                },
                "lon": {
                  "type": "number"
                },
                "type": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "address": {
                  "type": "object"
                },
                "boundingBox": {
                  "type": "array",
                  "items": {
                    "type": "number"
                  }
                }
              }
            }
          },
          "result": {
            "type": "object",
            "description": "Single result for reverse geocoding."
          },
          "attribution": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "query": "eiffel tower, paris",
        "limit": 1
      }
    },
    {
      "name": "route",
      "serviceName": "Directions + Travel Times",
      "resource": "https://homepage-efl.pages.dev/api/route",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.01",
      "description": "Point-to-point directions between 2-10 stops by car, bike, or on foot: total and per-leg distance and travel time, plus route geometry as an encoded polyline. Stops can be place names (geocoded automatically) or lat/lon coordinates. Generic travel and delivery routing on OpenStreetMap road data, global coverage. POST a JSON body like: {\"stops\":[\"paris\",\"lyon\"],\"mode\":\"car\"}",
      "tags": [
        "routing",
        "directions",
        "travel-time",
        "distance",
        "openstreetmap"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "stops"
        ],
        "properties": {
          "stops": {
            "type": "array",
            "minItems": 2,
            "maxItems": 10,
            "description": "Places to visit in order: name strings or {lat, lon} objects.",
            "items": {}
          },
          "mode": {
            "type": "string",
            "enum": [
              "car",
              "bike",
              "foot"
            ],
            "default": "car"
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string"
          },
          "distanceKm": {
            "type": "number"
          },
          "durationMinutes": {
            "type": "number"
          },
          "stops": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "lat": {
                  "type": "number"
                },
                "lon": {
                  "type": "number"
                },
                "name": {
                  "type": "string"
                },
                "snappedName": {
                  "type": "string",
                  "description": "Road the stop snapped to."
                }
              }
            }
          },
          "legs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "from": {
                  "type": "integer"
                },
                "to": {
                  "type": "integer"
                },
                "distanceKm": {
                  "type": "number"
                },
                "durationMinutes": {
                  "type": "number"
                }
              }
            }
          },
          "geometryPolyline": {
            "type": "string"
          },
          "attribution": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "stops": [
          "paris",
          "lyon"
        ],
        "mode": "car"
      }
    },
    {
      "name": "price",
      "serviceName": "Crypto & Token Prices",
      "resource": "https://homepage-efl.pages.dev/api/price",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Current USD prices for any crypto asset: majors by ticker (BTC, ETH, SOL), anything else by CoinGecko id or chain + contract address — so long-tail meme tokens work too. Up to 25 assets per call with per-asset confidence scores and timestamps. Crypto only; no equities or ETFs. POST a JSON body like: {\"symbols\":[\"BTC\",\"ETH\",\"pepe\"]}",
      "tags": [
        "price",
        "crypto",
        "token",
        "market",
        "defi"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "One ticker or CoinGecko id, e.g. \"BTC\", \"dogwifcoin\"."
          },
          "symbols": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 25,
            "description": "Batch of tickers/CoinGecko ids, or \"chain:address\" strings."
          },
          "tokens": {
            "type": "array",
            "maxItems": 25,
            "items": {
              "type": "object",
              "required": [
                "chain",
                "address"
              ],
              "properties": {
                "chain": {
                  "type": "string",
                  "description": "e.g. ethereum, base, arbitrum, optimism, polygon, bsc, solana."
                },
                "address": {
                  "type": "string",
                  "description": "Token contract address on that chain."
                }
              }
            },
            "description": "Any token by contract address (covers coins with no listing)."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer"
          },
          "found": {
            "type": "integer"
          },
          "prices": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "query": {
                  "type": "string",
                  "description": "Your input, echoed back."
                },
                "coin": {
                  "type": "string",
                  "description": "Resolved DefiLlama coin key."
                },
                "found": {
                  "type": "boolean"
                },
                "symbol": {
                  "type": "string"
                },
                "priceUsd": {
                  "type": "number"
                },
                "decimals": {
                  "type": "integer"
                },
                "confidence": {
                  "type": "number",
                  "description": "0-1 price confidence score."
                },
                "updatedAt": {
                  "type": "string"
                }
              }
            }
          },
          "note": {
            "type": "string",
            "description": "Present when some queries had no price."
          },
          "attribution": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "symbols": [
          "BTC",
          "ETH",
          "pepe"
        ]
      }
    },
    {
      "name": "hash",
      "serviceName": "Hash + HMAC",
      "resource": "https://homepage-efl.pages.dev/api/hash",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Compute cryptographic digests and HMACs deterministically: MD5, SHA-1, SHA-256, SHA-384, SHA-512, output as hex, base64, or base64url. Add a \"key\" for HMAC. Built for checksums, content addressing, and signature verification. Inputs are hashed and discarded. POST a JSON body like: {\"text\":\"hello world\",\"algorithm\":\"sha256\",\"encoding\":\"hex\"}",
      "tags": [
        "hash",
        "sha256",
        "md5",
        "hmac",
        "checksum"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "text": {
            "type": "string",
            "description": "The data to hash."
          },
          "algorithm": {
            "type": "string",
            "enum": [
              "md5",
              "sha1",
              "sha256",
              "sha384",
              "sha512"
            ],
            "default": "sha256"
          },
          "encoding": {
            "type": "string",
            "enum": [
              "hex",
              "base64",
              "base64url"
            ],
            "default": "hex"
          },
          "key": {
            "type": "string",
            "description": "If present, compute HMAC-<algorithm> with this key instead of a plain hash."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "algorithm": {
            "type": "string"
          },
          "encoding": {
            "type": "string"
          },
          "hash": {
            "type": "string"
          },
          "hmac": {
            "type": "boolean"
          }
        }
      },
      "exampleInput": {
        "text": "hello world",
        "algorithm": "sha256",
        "encoding": "hex"
      }
    },
    {
      "name": "encode",
      "serviceName": "Encode / Decode",
      "resource": "https://homepage-efl.pages.dev/api/encode",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Encode and decode text across base64, base64url, hex, URL-encoding, and HTML entities (UTF-8 safe). Also decodes (does not verify) JWTs into header and payload with human-readable exp/iat times. Built for wrangling tokens, data URIs, and escaped strings. POST a JSON body like: {\"text\":\"hello world\",\"codec\":\"base64\",\"operation\":\"encode\"}",
      "tags": [
        "base64",
        "hex",
        "url-encode",
        "jwt",
        "encoding"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "text": {
            "type": "string",
            "description": "The text to encode or decode."
          },
          "codec": {
            "type": "string",
            "enum": [
              "base64",
              "base64url",
              "hex",
              "url",
              "html"
            ]
          },
          "operation": {
            "type": "string",
            "enum": [
              "encode",
              "decode"
            ],
            "default": "encode"
          },
          "jwt": {
            "type": "string",
            "description": "Alternative mode: decode this JWT (no signature verification)."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "operation": {
            "type": "string"
          },
          "codec": {
            "type": "string"
          },
          "result": {
            "type": "string"
          },
          "header": {
            "type": "object",
            "description": "JWT mode: decoded header."
          },
          "payload": {
            "type": "object",
            "description": "JWT mode: decoded claims."
          }
        }
      },
      "exampleInput": {
        "text": "hello world",
        "codec": "base64",
        "operation": "encode"
      }
    },
    {
      "name": "color",
      "serviceName": "Color Convert + Contrast",
      "resource": "https://homepage-efl.pages.dev/api/color",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Parse any CSS color (hex, rgb(), hsl()) and emit all three formats plus relative luminance. Compute WCAG contrast ratios against a background with AA/AAA pass-fail for normal and large text, and lighten, darken, or mix colors. Built for agents generating accessible UI themes. POST a JSON body like: {\"color\":\"#3498db\",\"background\":\"#ffffff\"}",
      "tags": [
        "color",
        "hex",
        "rgb",
        "wcag",
        "contrast"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "color"
        ],
        "properties": {
          "color": {
            "type": "string",
            "description": "A color: \"#3498db\", \"rgb(52,152,219)\", or \"hsl(204,70%,53%)\"."
          },
          "background": {
            "type": "string",
            "description": "Optional second color for a WCAG contrast check."
          },
          "lighten": {
            "type": "number",
            "description": "Increase lightness by this many percent (0-100)."
          },
          "darken": {
            "type": "number",
            "description": "Decrease lightness by this many percent (0-100)."
          },
          "mix": {
            "type": "string",
            "description": "Blend the color toward this one."
          },
          "weight": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "default": 0.5,
            "description": "Mix weight toward \"mix\"."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "hex": {
            "type": "string"
          },
          "rgb": {
            "type": "object"
          },
          "hsl": {
            "type": "object"
          },
          "luminance": {
            "type": "number"
          },
          "contrast": {
            "type": "object",
            "description": "Present when \"background\" is given."
          },
          "adjusted": {
            "type": "string",
            "description": "Present when lighten/darken is given."
          },
          "mixed": {
            "type": "string",
            "description": "Present when \"mix\" is given."
          }
        }
      },
      "exampleInput": {
        "color": "#3498db",
        "background": "#ffffff"
      }
    },
    {
      "name": "csv",
      "serviceName": "CSV <-> JSON",
      "resource": "https://homepage-efl.pages.dev/api/csv",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.002",
      "description": "Convert CSV text to JSON and JSON rows back to CSV. RFC 4180 parsing (quoted fields, escaped quotes, embedded newlines), automatic delimiter detection (comma/semicolon/tab/pipe), and type coercion (numbers, booleans, nulls). Built for agents moving data between tabular and structured forms. POST a JSON body like: {\"csv\":\"name,age,active\\nAda,36,true\\nBob,29,false\"}",
      "tags": [
        "csv",
        "json",
        "conversion",
        "tabular",
        "parsing"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "csv": {
            "type": "string",
            "description": "CSV text to parse into JSON. Provide csv OR rows."
          },
          "rows": {
            "type": "array",
            "description": "Array of objects (or arrays) to serialize into CSV. Provide csv OR rows."
          },
          "delimiter": {
            "type": "string",
            "description": "Force a delimiter; otherwise auto-detected for parsing."
          },
          "header": {
            "type": "boolean",
            "default": true,
            "description": "Treat the first CSV row as column names."
          },
          "coerceTypes": {
            "type": "boolean",
            "default": true,
            "description": "Coerce numbers/booleans/nulls when parsing."
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Column order when building CSV."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "direction": {
            "type": "string",
            "enum": [
              "csv-to-json",
              "json-to-csv"
            ]
          },
          "delimiter": {
            "type": "string"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "rowCount": {
            "type": "integer"
          },
          "rows": {
            "type": "array"
          },
          "csv": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "csv": "name,age,active\nAda,36,true\nBob,29,false"
      }
    },
    {
      "name": "datetime",
      "serviceName": "Timezones + Date Math",
      "resource": "https://homepage-efl.pages.dev/api/datetime",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "The timezone conversions and date arithmetic LLMs get wrong, done exactly. Convert any ISO timestamp or Unix time into one or many IANA timezones (with UTC offset and weekday), add or subtract durations, and diff two instants into days/hours/minutes plus a humanized string. Omit \"datetime\" to get the current time. Uses the IANA timezone database. POST a JSON body like: {\"datetime\":\"2026-07-08T14:30:00Z\",\"timezone\":\"America/New_York\"}",
      "tags": [
        "datetime",
        "timezone",
        "date-math",
        "iso8601",
        "unix"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "datetime": {
            "description": "ISO 8601 string or Unix timestamp (seconds or millis). Defaults to now."
          },
          "timezone": {
            "type": "string",
            "description": "IANA timezone for the result, e.g. \"Asia/Tokyo\". Default UTC."
          },
          "timezones": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Convert into several zones at once."
          },
          "add": {
            "type": "object",
            "properties": {
              "amount": {
                "type": "number"
              },
              "unit": {
                "type": "string",
                "enum": [
                  "ms",
                  "seconds",
                  "minutes",
                  "hours",
                  "days",
                  "weeks"
                ]
              }
            },
            "description": "Add a duration (negative amount subtracts)."
          },
          "until": {
            "description": "Another datetime; returns the difference from \"datetime\" to this."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "result": {
            "description": "Zoned time (object), or an array when \"timezones\" is used."
          },
          "difference": {
            "type": "object",
            "description": "Present when \"until\" is given."
          },
          "applied": {
            "type": "object",
            "description": "Present when \"add\" is given."
          }
        }
      },
      "exampleInput": {
        "datetime": "2026-07-08T14:30:00Z",
        "timezone": "America/New_York"
      }
    },
    {
      "name": "chain-balance",
      "serviceName": "EVM Balance",
      "resource": "https://homepage-efl.pages.dev/api/chain-balance",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Native coin balance for any address on Ethereum, Base, Arbitrum, Optimism, Polygon, or BNB Chain, plus ERC-20 token balances (pass up to 10 contract addresses). Reads public chain state over JSON-RPC; no API keys. Amounts given raw and human-formatted. POST a JSON body like: {\"chain\":\"base\",\"address\":\"0xB86F95EF5FA904318Ea9Df3b59AdCe099b478fC4\"}",
      "tags": [
        "blockchain",
        "balance",
        "erc20",
        "evm",
        "wallet"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "chain",
          "address"
        ],
        "properties": {
          "chain": {
            "type": "string",
            "enum": [
              "ethereum",
              "base",
              "arbitrum",
              "optimism",
              "polygon",
              "bsc"
            ]
          },
          "address": {
            "type": "string",
            "description": "Wallet address (0x + 40 hex)."
          },
          "tokens": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 10,
            "description": "ERC-20 contract addresses to also read."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string"
          },
          "address": {
            "type": "string"
          },
          "native": {
            "type": "object",
            "properties": {
              "symbol": {
                "type": "string"
              },
              "wei": {
                "type": "string"
              },
              "balance": {
                "type": "string"
              }
            }
          },
          "tokens": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      },
      "exampleInput": {
        "chain": "base",
        "address": "0xB86F95EF5FA904318Ea9Df3b59AdCe099b478fC4"
      }
    },
    {
      "name": "chain-token",
      "serviceName": "ERC-20 Token Info",
      "resource": "https://homepage-efl.pages.dev/api/chain-token",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "ERC-20 token metadata — name, symbol, decimals, total supply — for any token contract on Ethereum, Base, Arbitrum, Optimism, Polygon, or BNB Chain. Optionally include a \"holder\" address to also read that wallet's balance. Public JSON-RPC reads, no API keys. POST a JSON body like: {\"chain\":\"base\",\"address\":\"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\"}",
      "tags": [
        "blockchain",
        "erc20",
        "token",
        "evm",
        "metadata"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "chain",
          "address"
        ],
        "properties": {
          "chain": {
            "type": "string",
            "enum": [
              "ethereum",
              "base",
              "arbitrum",
              "optimism",
              "polygon",
              "bsc"
            ]
          },
          "address": {
            "type": "string",
            "description": "Token contract address."
          },
          "holder": {
            "type": "string",
            "description": "Optional wallet whose balance to include."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string"
          },
          "contract": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "symbol": {
            "type": "string"
          },
          "decimals": {
            "type": "integer"
          },
          "totalSupply": {
            "type": "object"
          },
          "holder": {
            "type": "object"
          }
        }
      },
      "exampleInput": {
        "chain": "base",
        "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
      }
    },
    {
      "name": "chain-tx",
      "serviceName": "EVM Transaction",
      "resource": "https://homepage-efl.pages.dev/api/chain-tx",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Look up a transaction and its receipt on Ethereum, Base, Arbitrum, Optimism, Polygon, or BNB Chain: status (success/reverted/pending), from/to, value, block, nonce, gas used and price, log count, and any contract created. Public JSON-RPC, no API keys. POST a JSON body like: {\"chain\":\"base\",\"hash\":\"0xb498053e345acd227657ef2e3de7d9fd9b861d673368419c4b18cfaea20365c8\"}",
      "tags": [
        "blockchain",
        "transaction",
        "receipt",
        "evm",
        "onchain"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "chain",
          "hash"
        ],
        "properties": {
          "chain": {
            "type": "string",
            "enum": [
              "ethereum",
              "base",
              "arbitrum",
              "optimism",
              "polygon",
              "bsc"
            ]
          },
          "hash": {
            "type": "string",
            "description": "Transaction hash (0x + 64 hex)."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string"
          },
          "hash": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "from": {
            "type": "string"
          },
          "to": {
            "type": "string"
          },
          "value": {
            "type": "object"
          },
          "blockNumber": {
            "type": "integer"
          },
          "gas": {
            "type": "object"
          },
          "logs": {
            "type": "integer"
          }
        }
      },
      "exampleInput": {
        "chain": "base",
        "hash": "0xb498053e345acd227657ef2e3de7d9fd9b861d673368419c4b18cfaea20365c8"
      }
    },
    {
      "name": "chain-block",
      "serviceName": "EVM Block",
      "resource": "https://homepage-efl.pages.dev/api/chain-block",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Fetch a block header by number, hash, or \"latest\" on Ethereum, Base, Arbitrum, Optimism, Polygon, or BNB Chain: timestamp, miner, gas used/limit, base fee, transaction count, size. Public JSON-RPC, no API keys. POST a JSON body like: {\"chain\":\"base\",\"block\":\"latest\"}",
      "tags": [
        "blockchain",
        "block",
        "evm",
        "onchain",
        "header"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "chain"
        ],
        "properties": {
          "chain": {
            "type": "string",
            "enum": [
              "ethereum",
              "base",
              "arbitrum",
              "optimism",
              "polygon",
              "bsc"
            ]
          },
          "block": {
            "description": "Block number, \"latest\" (default), or a 0x block hash."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string"
          },
          "number": {
            "type": "integer"
          },
          "hash": {
            "type": "string"
          },
          "timestamp": {
            "type": "integer"
          },
          "time": {
            "type": "string"
          },
          "gasUsed": {
            "type": "integer"
          },
          "baseFeeGwei": {
            "type": "string"
          },
          "transactionCount": {
            "type": "integer"
          }
        }
      },
      "exampleInput": {
        "chain": "base",
        "block": "latest"
      }
    },
    {
      "name": "chain-gas",
      "serviceName": "EVM Gas Price",
      "resource": "https://homepage-efl.pages.dev/api/chain-gas",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Current gas price and EIP-1559 fee suggestions (base fee, priority tip, suggested max fee) on Ethereum, Base, Arbitrum, Optimism, Polygon, or BNB Chain, in gwei. Public JSON-RPC, no API keys. POST a JSON body like: {\"chain\":\"ethereum\"}",
      "tags": [
        "blockchain",
        "gas",
        "fees",
        "evm",
        "eip1559"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "chain"
        ],
        "properties": {
          "chain": {
            "type": "string",
            "enum": [
              "ethereum",
              "base",
              "arbitrum",
              "optimism",
              "polygon",
              "bsc"
            ]
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "chain": {
            "type": "string"
          },
          "gasPriceGwei": {
            "type": "string"
          },
          "baseFeeGwei": {
            "type": "string"
          },
          "priorityFeeGwei": {
            "type": "string"
          },
          "suggestedMaxFeeGwei": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "chain": "ethereum"
      }
    },
    {
      "name": "wiki",
      "serviceName": "Wikipedia Search",
      "resource": "https://homepage-efl.pages.dev/api/wiki",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.003",
      "description": "Search Wikipedia and pull article summaries in 300+ languages. Pass \"query\" for ranked search results (title, snippet, link) or \"title\" for one article's summary, description, and thumbnail. Official MediaWiki API; content is CC BY-SA 4.0, attributed in every response. POST a JSON body like: {\"query\":\"Ada Lovelace\",\"limit\":5}",
      "tags": [
        "wikipedia",
        "search",
        "reference",
        "knowledge",
        "encyclopedia"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Search term. Provide query OR title."
          },
          "title": {
            "type": "string",
            "description": "Exact article title to summarize. Provide query OR title."
          },
          "lang": {
            "type": "string",
            "default": "en",
            "description": "Wikipedia language edition, e.g. \"en\", \"de\", \"ja\"."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "default": 5,
            "description": "Max search results."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "search",
              "summary"
            ]
          },
          "lang": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "article": {
            "type": "object",
            "description": "Present in summary mode."
          },
          "attribution": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "query": "Ada Lovelace",
        "limit": 5
      }
    },
    {
      "name": "dns",
      "serviceName": "DNS Lookup",
      "resource": "https://homepage-efl.pages.dev/api/dns",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.002",
      "description": "Resolve DNS records over DNS-over-HTTPS: A, AAAA, MX, TXT, NS, CNAME, SOA, CAA, SRV, PTR and more. Returns parsed answers with TTLs and the response status. Built for agents checking mail routing, domain config, or propagation. POST a JSON body like: {\"name\":\"example.com\",\"type\":\"MX\"}",
      "tags": [
        "dns",
        "doh",
        "mx",
        "records",
        "network"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Domain to look up, e.g. \"example.com\"."
          },
          "type": {
            "type": "string",
            "enum": [
              "A",
              "AAAA",
              "MX",
              "TXT",
              "NS",
              "CNAME",
              "SOA",
              "PTR",
              "SRV",
              "CAA",
              "DS",
              "DNSKEY",
              "HTTPS"
            ],
            "default": "A"
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string"
          },
          "answerCount": {
            "type": "integer"
          },
          "answers": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                },
                "ttl": {
                  "type": "integer"
                },
                "data": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "exampleInput": {
        "name": "example.com",
        "type": "MX"
      }
    },
    {
      "name": "ip",
      "serviceName": "IP + CIDR Math",
      "resource": "https://homepage-efl.pages.dev/api/ip",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "IPv4 and IPv6 address inspection and subnet math. Inspect an address (version, normalized form, classification: private/loopback/link-local/multicast/global, integer), compute a CIDR block (network, netmask, broadcast, host range, counts), or test whether an address falls inside a range. Deterministic, no lookups. POST a JSON body like: {\"cidr\":\"192.168.1.0/24\"}",
      "tags": [
        "ip",
        "cidr",
        "subnet",
        "ipv6",
        "network"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "ip": {
            "type": "string",
            "description": "An IPv4 or IPv6 address to inspect (or the address for a containment test)."
          },
          "cidr": {
            "type": "string",
            "description": "A CIDR block for subnet math (or the range for a containment test)."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "type": "string",
            "enum": [
              "address",
              "subnet",
              "contains"
            ]
          },
          "version": {
            "type": "integer"
          },
          "classification": {
            "type": "string"
          },
          "network": {
            "type": "string"
          },
          "netmask": {
            "type": "string"
          },
          "broadcast": {
            "type": "string"
          },
          "usableHosts": {
            "type": "string"
          },
          "contained": {
            "type": "boolean"
          }
        }
      },
      "exampleInput": {
        "cidr": "192.168.1.0/24"
      }
    },
    {
      "name": "phone",
      "serviceName": "Phone Validator",
      "resource": "https://homepage-efl.pages.dev/api/phone",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Validate and parse phone numbers in international E.164 form: extract the country calling code and region, the national number, and the canonical +E.164 string. Single number or a batch of up to 50. Format validation, not a line-in-service check. POST a JSON body like: {\"phone\":\"+14155552671\"}",
      "tags": [
        "phone",
        "e164",
        "validation",
        "telephone",
        "msisdn"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "phone": {
            "type": "string",
            "description": "One number in E.164 form, e.g. \"+14155552671\"."
          },
          "phones": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "description": "Batch of numbers."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "e164": {
            "type": "string"
          },
          "countryCode": {
            "type": "string"
          },
          "region": {
            "type": "string"
          },
          "nationalNumber": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "description": "Present for batch input."
          }
        }
      },
      "exampleInput": {
        "phone": "+14155552671"
      }
    },
    {
      "name": "iban",
      "serviceName": "IBAN Validator",
      "resource": "https://homepage-efl.pages.dev/api/iban",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Validate International Bank Account Numbers: ISO 13616 country/length check plus the ISO 7064 mod-97 checksum. Returns the country, check digits, and the BBAN. Single IBAN or a batch of up to 50. Validates structure and checksum, not that the account is open. POST a JSON body like: {\"iban\":\"DE89 3704 0044 0532 0130 00\"}",
      "tags": [
        "iban",
        "banking",
        "validation",
        "sepa",
        "finance"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "iban": {
            "type": "string",
            "description": "One IBAN; spaces are ignored."
          },
          "ibans": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "description": "Batch of IBANs."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "country": {
            "type": "string"
          },
          "checkDigits": {
            "type": "string"
          },
          "bban": {
            "type": "string"
          },
          "formatted": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "description": "Present for batch input."
          }
        }
      },
      "exampleInput": {
        "iban": "DE89 3704 0044 0532 0130 00"
      }
    },
    {
      "name": "card",
      "serviceName": "Card Number Validator",
      "resource": "https://homepage-efl.pages.dev/api/card",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.001",
      "description": "Validate payment card numbers: Luhn checksum plus network detection (Visa, Mastercard, Amex, Discover, Diners, JCB, UnionPay, Maestro) with per-network length rules. Returns the network, Luhn result, and last four digits. Structure only — never that the card exists or has funds. No card data is stored or logged. POST a JSON body like: {\"card\":\"4111 1111 1111 1111\"}",
      "tags": [
        "credit-card",
        "luhn",
        "validation",
        "payments",
        "bin"
      ],
      "inputSchema": {
        "type": "object",
        "properties": {
          "card": {
            "type": "string",
            "description": "One card number; spaces and dashes ignored."
          },
          "cards": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 50,
            "description": "Batch of card numbers."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "network": {
            "type": "string"
          },
          "digits": {
            "type": "integer"
          },
          "luhn": {
            "type": "boolean"
          },
          "last4": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "description": "Present for batch input."
          }
        }
      },
      "exampleInput": {
        "card": "4111 1111 1111 1111"
      }
    },
    {
      "name": "book",
      "serviceName": "Book Lookup by ISBN",
      "resource": "https://homepage-efl.pages.dev/api/book",
      "method": "POST",
      "contentType": "application/json",
      "priceUsd": "0.004",
      "description": "Look up a book by ISBN (10 or 13 digit): title, subtitle, authors, publishers, publish date, page count, subjects, and cover image. Validates the ISBN check digit first (rejecting typos unpaid) and returns both ISBN forms. Data from Open Library; attributed in every response. POST a JSON body like: {\"isbn\":\"9780140328721\"}",
      "tags": [
        "isbn",
        "book",
        "library",
        "metadata",
        "lookup"
      ],
      "inputSchema": {
        "type": "object",
        "required": [
          "isbn"
        ],
        "properties": {
          "isbn": {
            "type": "string",
            "description": "A 10- or 13-digit ISBN; hyphens and spaces are ignored."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "isbn": {
            "type": "object",
            "properties": {
              "isbn10": {
                "type": "string"
              },
              "isbn13": {
                "type": "string"
              }
            }
          },
          "book": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "subtitle": {
                "type": "string"
              },
              "authors": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "publishers": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "publishDate": {
                "type": "string"
              },
              "pageCount": {
                "type": "integer"
              },
              "subjects": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "cover": {
                "type": "string"
              },
              "openLibraryUrl": {
                "type": "string"
              }
            }
          },
          "attribution": {
            "type": "string"
          }
        }
      },
      "exampleInput": {
        "isbn": "9780140328721"
      }
    }
  ]
}