{"openapi":"3.1.0","info":{"title":"invoker.tools API","version":"v1","description":"Free, read-only developer & network tools (DNS, email deliverability, TLS, IP). No API key; rate-limited per IP. The same tools are also available over MCP at /api/mcp.","contact":{"name":"invoker","url":"https://www.invoker.nl"}},"servers":[{"url":"https://invoker.tools"}],"externalDocs":{"description":"Human docs & MCP","url":"https://invoker.tools/api"},"paths":{"/api/v1/tools/ip":{"get":{"summary":"Your public IP (IPv4/IPv6) as seen by the server, plus the request headers behind it.","operationId":"get_ip","tags":["data"],"parameters":[],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"ip"},"result":{"type":"object","description":"ip output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Your public IP (IPv4/IPv6) as seen by the server, plus the request headers behind it.","operationId":"post_ip","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"ip"},"result":{"type":"object","description":"ip output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/dns":{"get":{"summary":"Resolve A, AAAA, MX, TXT, NS, CNAME or SOA records for a domain via public resolvers.","operationId":"get_dns","tags":["network"],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain to look up, e.g. example.com"}},{"name":"type","in":"query","required":false,"schema":{"description":"DNS record type (default A)","type":"string","enum":["A","AAAA","MX","TXT","NS","CNAME","SOA"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dns"},"result":{"type":"object","description":"dns output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Resolve A, AAAA, MX, TXT, NS, CNAME or SOA records for a domain via public resolvers.","operationId":"post_dns","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"Domain to look up, e.g. example.com"},"type":{"description":"DNS record type (default A)","type":"string","enum":["A","AAAA","MX","TXT","NS","CNAME","SOA"]}},"required":["domain"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dns"},"result":{"type":"object","description":"dns output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/mx":{"get":{"summary":"List a domain's mail servers by priority and resolve each to its A/AAAA addresses.","operationId":"get_mx","tags":["network"],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain to look up MX records for"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"mx"},"result":{"type":"object","description":"mx output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"List a domain's mail servers by priority and resolve each to its A/AAAA addresses.","operationId":"post_mx","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"Domain to look up MX records for"}},"required":["domain"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"mx"},"result":{"type":"object","description":"mx output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/spf":{"get":{"summary":"Look up and parse a domain's SPF record; count DNS lookups and flag the all qualifier.","operationId":"get_spf","tags":["network"],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain to check SPF for"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"spf"},"result":{"type":"object","description":"spf output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Look up and parse a domain's SPF record; count DNS lookups and flag the all qualifier.","operationId":"post_spf","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"Domain to check SPF for"}},"required":["domain"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"spf"},"result":{"type":"object","description":"spf output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/dmarc":{"get":{"summary":"Resolve and parse the _dmarc policy, with warnings for p=none, missing rua and pct<100.","operationId":"get_dmarc","tags":["network"],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Domain to check DMARC for"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dmarc"},"result":{"type":"object","description":"dmarc output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Resolve and parse the _dmarc policy, with warnings for p=none, missing rua and pct<100.","operationId":"post_dmarc","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"Domain to check DMARC for"}},"required":["domain"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dmarc"},"result":{"type":"object","description":"dmarc output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/dkim":{"get":{"summary":"Fetch a DKIM public key by selector and flag revoked (empty p=) or test-mode keys.","operationId":"get_dkim","tags":["network"],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"Signing domain (the DKIM d= value)"}},{"name":"selector","in":"query","required":true,"schema":{"type":"string","description":"DKIM selector (the s= value), e.g. google"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dkim"},"result":{"type":"object","description":"dkim output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Fetch a DKIM public key by selector and flag revoked (empty p=) or test-mode keys.","operationId":"post_dkim","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"Signing domain (the DKIM d= value)"},"selector":{"type":"string","description":"DKIM selector (the s= value), e.g. google"}},"required":["domain","selector"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dkim"},"result":{"type":"object","description":"dkim output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/rdns":{"get":{"summary":"Reverse DNS (PTR) + forward-confirmed reverse DNS (FCrDNS) for an IP address.","operationId":"get_rdns","tags":["network"],"parameters":[{"name":"ip","in":"query","required":true,"schema":{"type":"string","description":"IPv4 or IPv6 address"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"rdns"},"result":{"type":"object","description":"rdns output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Reverse DNS (PTR) + forward-confirmed reverse DNS (FCrDNS) for an IP address.","operationId":"post_rdns","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"ip":{"type":"string","description":"IPv4 or IPv6 address"}},"required":["ip"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"rdns"},"result":{"type":"object","description":"rdns output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/ssl":{"get":{"summary":"Inspect a host's live TLS certificate: expiry, issuer, SANs, chain and trust. SSRF-guarded.","operationId":"get_ssl","tags":["network"],"parameters":[{"name":"host","in":"query","required":true,"schema":{"type":"string","description":"Hostname or host:port (default 443). Private targets are refused."}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"ssl"},"result":{"type":"object","description":"ssl output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Inspect a host's live TLS certificate: expiry, issuer, SANs, chain and trust. SSRF-guarded.","operationId":"post_ssl","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"host":{"type":"string","description":"Hostname or host:port (default 443). Private targets are refused."}},"required":["host"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"ssl"},"result":{"type":"object","description":"ssl output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/whois":{"get":{"summary":"WHOIS/RDAP registration data for a domain or IP: registrar, status, key dates and nameservers.","operationId":"get_whois","tags":["network"],"parameters":[{"name":"query","in":"query","required":true,"schema":{"type":"string","description":"a domain (example.com) or an IP address"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"whois"},"result":{"type":"object","description":"whois output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"WHOIS/RDAP registration data for a domain or IP: registrar, status, key dates and nameservers.","operationId":"post_whois","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"type":"string","description":"a domain (example.com) or an IP address"}},"required":["query"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"whois"},"result":{"type":"object","description":"whois output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/dnsbl":{"get":{"summary":"Check an IPv4 address (or a domain's A record) against ~10 well-known DNS blacklists.","operationId":"get_dnsbl","tags":["network"],"parameters":[{"name":"target","in":"query","required":true,"schema":{"type":"string","description":"IPv4 address or domain to check"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dnsbl"},"result":{"type":"object","description":"dnsbl output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Check an IPv4 address (or a domain's A record) against ~10 well-known DNS blacklists.","operationId":"post_dnsbl","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"target":{"type":"string","description":"IPv4 address or domain to check"}},"required":["target"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"dnsbl"},"result":{"type":"object","description":"dnsbl output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/http":{"get":{"summary":"Fetch a URL and report HTTP status, response headers, the redirect chain and timing. SSRF-guarded.","operationId":"get_http","tags":["network"],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"the http(s) URL to inspect"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"http"},"result":{"type":"object","description":"http output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Fetch a URL and report HTTP status, response headers, the redirect chain and timing. SSRF-guarded.","operationId":"post_http","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"the http(s) URL to inspect"}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"http"},"result":{"type":"object","description":"http output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/up":{"get":{"summary":"Check whether a website is up: HTTP status, response time and final URL after redirects.","operationId":"get_up","tags":["network"],"parameters":[{"name":"url","in":"query","required":true,"schema":{"type":"string","description":"a URL or bare domain to check"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"up"},"result":{"type":"object","description":"up output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Check whether a website is up: HTTP status, response time and final URL after redirects.","operationId":"post_up","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"url":{"type":"string","description":"a URL or bare domain to check"}},"required":["url"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"up"},"result":{"type":"object","description":"up output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/propagation":{"get":{"summary":"Query several public DNS resolvers and compare their answers to check DNS propagation.","operationId":"get_propagation","tags":["network"],"parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string","description":"domain to check"}},{"name":"type","in":"query","required":false,"schema":{"description":"record type (default A)","type":"string","enum":["A","AAAA","MX","TXT","NS","CNAME"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"propagation"},"result":{"type":"object","description":"propagation output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Query several public DNS resolvers and compare their answers to check DNS propagation.","operationId":"post_propagation","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"domain":{"type":"string","description":"domain to check"},"type":{"description":"record type (default A)","type":"string","enum":["A","AAAA","MX","TXT","NS","CNAME"]}},"required":["domain"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"propagation"},"result":{"type":"object","description":"propagation output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/port":{"get":{"summary":"Check whether a TCP port is open on a host: open / closed / filtered verdict, resolved IP and connect timing. SSRF-guarded.","operationId":"get_port","tags":["network"],"parameters":[{"name":"host","in":"query","required":true,"schema":{"type":"string","description":"Hostname or IP, optionally host:port (e.g. example.com or example.com:22). Private targets are refused."}},{"name":"port","in":"query","required":false,"schema":{"type":"string","description":"TCP port 1-65535 (optional if given as host:port)"}},{"name":"timeout","in":"query","required":false,"schema":{"type":"string","description":"Connect timeout in ms (default 5000, max 10000)"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"port"},"result":{"type":"object","description":"port output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Check whether a TCP port is open on a host: open / closed / filtered verdict, resolved IP and connect timing. SSRF-guarded.","operationId":"post_port","tags":["network"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"host":{"type":"string","description":"Hostname or IP, optionally host:port (e.g. example.com or example.com:22). Private targets are refused."},"port":{"type":"string","description":"TCP port 1-65535 (optional if given as host:port)"},"timeout":{"type":"string","description":"Connect timeout in ms (default 5000, max 10000)"}},"required":["host"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"port"},"result":{"type":"object","description":"port output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/uuid":{"get":{"summary":"Generate one or many RFC 4122 version 4 (random) UUIDs.","operationId":"get_uuid","tags":["data"],"parameters":[{"name":"count","in":"query","required":false,"schema":{"description":"how many, 1-100 (default 1)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"uuid"},"result":{"type":"object","description":"uuid output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate one or many RFC 4122 version 4 (random) UUIDs.","operationId":"post_uuid","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"count":{"description":"how many, 1-100 (default 1)","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"uuid"},"result":{"type":"object","description":"uuid output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/ids":{"get":{"summary":"Generate time-sortable ULID or UUIDv7 identifiers.","operationId":"get_ids","tags":["data"],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"description":"identifier type (default ulid)","type":"string","enum":["ulid","uuidv7"]}},{"name":"count","in":"query","required":false,"schema":{"description":"how many, 1-100 (default 1)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"ids"},"result":{"type":"object","description":"ids output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate time-sortable ULID or UUIDv7 identifiers.","operationId":"post_ids","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"description":"identifier type (default ulid)","type":"string","enum":["ulid","uuidv7"]},"count":{"description":"how many, 1-100 (default 1)","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"ids"},"result":{"type":"object","description":"ids output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/password":{"get":{"summary":"Generate a cryptographically strong random password with chosen character sets.","operationId":"get_password","tags":["data"],"parameters":[{"name":"length","in":"query","required":false,"schema":{"description":"length 6-128 (default 20)","type":"string"}},{"name":"lower","in":"query","required":false,"schema":{"description":"include a-z (default true)","type":"string"}},{"name":"upper","in":"query","required":false,"schema":{"description":"include A-Z (default true)","type":"string"}},{"name":"digits","in":"query","required":false,"schema":{"description":"include 0-9 (default true)","type":"string"}},{"name":"symbols","in":"query","required":false,"schema":{"description":"include symbols (default true)","type":"string"}},{"name":"noAmbiguous","in":"query","required":false,"schema":{"description":"exclude ambiguous chars like O/0 (default false)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"password"},"result":{"type":"object","description":"password output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate a cryptographically strong random password with chosen character sets.","operationId":"post_password","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"length":{"description":"length 6-128 (default 20)","type":"string"},"lower":{"description":"include a-z (default true)","type":"string"},"upper":{"description":"include A-Z (default true)","type":"string"},"digits":{"description":"include 0-9 (default true)","type":"string"},"symbols":{"description":"include symbols (default true)","type":"string"},"noAmbiguous":{"description":"exclude ambiguous chars like O/0 (default false)","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"password"},"result":{"type":"object","description":"password output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/passphrase":{"get":{"summary":"Generate a memorable diceware-style passphrase with an entropy estimate.","operationId":"get_passphrase","tags":["data"],"parameters":[{"name":"words","in":"query","required":false,"schema":{"description":"number of words 2-12 (default 5)","type":"string"}},{"name":"separator","in":"query","required":false,"schema":{"description":"default dash","type":"string","enum":["dash","dot","space","underscore"]}},{"name":"capitalize","in":"query","required":false,"schema":{"description":"capitalize each word (default true)","type":"string"}},{"name":"number","in":"query","required":false,"schema":{"description":"append a number (default true)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"passphrase"},"result":{"type":"object","description":"passphrase output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate a memorable diceware-style passphrase with an entropy estimate.","operationId":"post_passphrase","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"words":{"description":"number of words 2-12 (default 5)","type":"string"},"separator":{"description":"default dash","type":"string","enum":["dash","dot","space","underscore"]},"capitalize":{"description":"capitalize each word (default true)","type":"string"},"number":{"description":"append a number (default true)","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"passphrase"},"result":{"type":"object","description":"passphrase output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/hash":{"get":{"summary":"Compute a SHA-1/256/384/512 digest of text.","operationId":"get_hash","tags":["data"],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"text to hash"}},{"name":"algorithm","in":"query","required":false,"schema":{"description":"default SHA-256","type":"string","enum":["SHA-1","SHA-256","SHA-384","SHA-512"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"hash"},"result":{"type":"object","description":"hash output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Compute a SHA-1/256/384/512 digest of text.","operationId":"post_hash","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"text to hash"},"algorithm":{"description":"default SHA-256","type":"string","enum":["SHA-1","SHA-256","SHA-384","SHA-512"]}},"required":["text"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"hash"},"result":{"type":"object","description":"hash output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/base64":{"get":{"summary":"Encode or decode Base64 (UTF-8 safe).","operationId":"get_base64","tags":["data"],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"text to encode, or Base64 to decode"}},{"name":"mode","in":"query","required":false,"schema":{"description":"default encode","type":"string","enum":["encode","decode"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"base64"},"result":{"type":"object","description":"base64 output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Encode or decode Base64 (UTF-8 safe).","operationId":"post_base64","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"text to encode, or Base64 to decode"},"mode":{"description":"default encode","type":"string","enum":["encode","decode"]}},"required":["text"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"base64"},"result":{"type":"object","description":"base64 output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/jwt":{"get":{"summary":"Decode a JWT header + payload and read exp/iat/nbf. Signature is NOT verified.","operationId":"get_jwt","tags":["data"],"parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"the JWT (header.payload.signature)"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"jwt"},"result":{"type":"object","description":"jwt output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Decode a JWT header + payload and read exp/iat/nbf. Signature is NOT verified.","operationId":"post_jwt","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string","description":"the JWT (header.payload.signature)"}},"required":["token"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"jwt"},"result":{"type":"object","description":"jwt output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/json":{"get":{"summary":"Format (pretty-print), minify and validate JSON.","operationId":"get_json","tags":["data"],"parameters":[{"name":"json","in":"query","required":true,"schema":{"type":"string","description":"JSON text"}},{"name":"mode","in":"query","required":false,"schema":{"description":"default format","type":"string","enum":["format","minify"]}},{"name":"indent","in":"query","required":false,"schema":{"description":"spaces for format (default 2)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"json"},"result":{"type":"object","description":"json output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Format (pretty-print), minify and validate JSON.","operationId":"post_json","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"json":{"type":"string","description":"JSON text"},"mode":{"description":"default format","type":"string","enum":["format","minify"]},"indent":{"description":"spaces for format (default 2)","type":"string"}},"required":["json"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"json"},"result":{"type":"object","description":"json output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/case":{"get":{"summary":"Convert text case (upper/lower/title/sentence/camel/pascal/snake/kebab/constant) with counts.","operationId":"get_case","tags":["data"],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"text to convert"}},{"name":"case","in":"query","required":true,"schema":{"type":"string","enum":["upper","lower","title","sentence","camel","pascal","snake","kebab","constant"],"description":"target case"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"case"},"result":{"type":"object","description":"case output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Convert text case (upper/lower/title/sentence/camel/pascal/snake/kebab/constant) with counts.","operationId":"post_case","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"text to convert"},"case":{"type":"string","enum":["upper","lower","title","sentence","camel","pascal","snake","kebab","constant"],"description":"target case"}},"required":["text","case"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"case"},"result":{"type":"object","description":"case output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/numbers":{"get":{"summary":"Convert an integer between binary, octal, decimal, hex and any base 2-36 (BigInt).","operationId":"get_numbers","tags":["data"],"parameters":[{"name":"value","in":"query","required":true,"schema":{"type":"string","description":"the integer, in the input base"}},{"name":"from","in":"query","required":false,"schema":{"description":"input base 2-36 (default 10)","type":"string"}},{"name":"to","in":"query","required":false,"schema":{"description":"an extra output base 2-36","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"numbers"},"result":{"type":"object","description":"numbers output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Convert an integer between binary, octal, decimal, hex and any base 2-36 (BigInt).","operationId":"post_numbers","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"type":"string","description":"the integer, in the input base"},"from":{"description":"input base 2-36 (default 10)","type":"string"},"to":{"description":"an extra output base 2-36","type":"string"}},"required":["value"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"numbers"},"result":{"type":"object","description":"numbers output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/chmod":{"get":{"summary":"Convert a Unix octal file mode to symbolic notation and the chmod command.","operationId":"get_chmod","tags":["data"],"parameters":[{"name":"mode","in":"query","required":true,"schema":{"type":"string","description":"octal mode, e.g. 755 or 1777"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"chmod"},"result":{"type":"object","description":"chmod output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Convert a Unix octal file mode to symbolic notation and the chmod command.","operationId":"post_chmod","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mode":{"type":"string","description":"octal mode, e.g. 755 or 1777"}},"required":["mode"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"chmod"},"result":{"type":"object","description":"chmod output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/subnet":{"get":{"summary":"IPv4 CIDR breakdown: network, broadcast, mask, wildcard, host range and usable count.","operationId":"get_subnet","tags":["data"],"parameters":[{"name":"cidr","in":"query","required":true,"schema":{"type":"string","description":"IPv4 address with optional /prefix, e.g. 192.168.1.10/24"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"subnet"},"result":{"type":"object","description":"subnet output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"IPv4 CIDR breakdown: network, broadcast, mask, wildcard, host range and usable count.","operationId":"post_subnet","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"cidr":{"type":"string","description":"IPv4 address with optional /prefix, e.g. 192.168.1.10/24"}},"required":["cidr"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"subnet"},"result":{"type":"object","description":"subnet output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/cron":{"get":{"summary":"Validate a 5-field cron expression and return the next run times (UTC).","operationId":"get_cron","tags":["data"],"parameters":[{"name":"expr","in":"query","required":true,"schema":{"type":"string","description":"cron expression: min hour day-of-month month day-of-week"}},{"name":"count","in":"query","required":false,"schema":{"description":"how many next runs, 1-20 (default 5)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"cron"},"result":{"type":"object","description":"cron output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Validate a 5-field cron expression and return the next run times (UTC).","operationId":"post_cron","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"expr":{"type":"string","description":"cron expression: min hour day-of-month month day-of-week"},"count":{"description":"how many next runs, 1-20 (default 5)","type":"string"}},"required":["expr"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"cron"},"result":{"type":"object","description":"cron output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/totp":{"get":{"summary":"Generate a TOTP secret + otpauth URI, or compute the current 6-digit code for a secret (RFC 6238).","operationId":"get_totp","tags":["data"],"parameters":[{"name":"secret","in":"query","required":false,"schema":{"description":"base32 secret; omit to generate a new one","type":"string"}},{"name":"issuer","in":"query","required":false,"schema":{"description":"issuer label (default invoker.tools)","type":"string"}},{"name":"account","in":"query","required":false,"schema":{"description":"account label (default user@example.com)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"totp"},"result":{"type":"object","description":"totp output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate a TOTP secret + otpauth URI, or compute the current 6-digit code for a secret (RFC 6238).","operationId":"post_totp","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"secret":{"description":"base32 secret; omit to generate a new one","type":"string"},"issuer":{"description":"issuer label (default invoker.tools)","type":"string"},"account":{"description":"account label (default user@example.com)","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"totp"},"result":{"type":"object","description":"totp output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/meta":{"get":{"summary":"Generate SEO + Open Graph + Twitter Card meta tags for a page.","operationId":"get_meta","tags":["data"],"parameters":[{"name":"title","in":"query","required":true,"schema":{"type":"string","description":"page title"}},{"name":"description","in":"query","required":true,"schema":{"type":"string","description":"meta description"}},{"name":"url","in":"query","required":false,"schema":{"description":"canonical URL","type":"string"}},{"name":"image","in":"query","required":false,"schema":{"description":"share image URL","type":"string"}},{"name":"site","in":"query","required":false,"schema":{"description":"site name","type":"string"}},{"name":"card","in":"query","required":false,"schema":{"description":"twitter card (default summary_large_image)","type":"string","enum":["summary_large_image","summary"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"meta"},"result":{"type":"object","description":"meta output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate SEO + Open Graph + Twitter Card meta tags for a page.","operationId":"post_meta","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"title":{"type":"string","description":"page title"},"description":{"type":"string","description":"meta description"},"url":{"description":"canonical URL","type":"string"},"image":{"description":"share image URL","type":"string"},"site":{"description":"site name","type":"string"},"card":{"description":"twitter card (default summary_large_image)","type":"string","enum":["summary_large_image","summary"]}},"required":["title","description"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"meta"},"result":{"type":"object","description":"meta output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/lorem":{"get":{"summary":"Generate Lorem Ipsum placeholder text by paragraphs, sentences or words.","operationId":"get_lorem","tags":["data"],"parameters":[{"name":"count","in":"query","required":false,"schema":{"description":"amount, 1-50 (default 3)","type":"string"}},{"name":"unit","in":"query","required":false,"schema":{"description":"default paragraphs","type":"string","enum":["paragraphs","sentences","words"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"lorem"},"result":{"type":"object","description":"lorem output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate Lorem Ipsum placeholder text by paragraphs, sentences or words.","operationId":"post_lorem","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"count":{"description":"amount, 1-50 (default 3)","type":"string"},"unit":{"description":"default paragraphs","type":"string","enum":["paragraphs","sentences","words"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"lorem"},"result":{"type":"object","description":"lorem output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/palette":{"get":{"summary":"Generate a harmonious 5-colour palette (random/analogous/complementary/triad/monochrome).","operationId":"get_palette","tags":["data"],"parameters":[{"name":"scheme","in":"query","required":false,"schema":{"description":"default random","type":"string","enum":["random","analogous","complementary","triad","monochrome"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"palette"},"result":{"type":"object","description":"palette output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Generate a harmonious 5-colour palette (random/analogous/complementary/triad/monochrome).","operationId":"post_palette","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"scheme":{"description":"default random","type":"string","enum":["random","analogous","complementary","triad","monochrome"]}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"palette"},"result":{"type":"object","description":"palette output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/headers":{"get":{"summary":"Parse raw email headers into a hop timeline with delays, SPF/DKIM/DMARC results and source IP.","operationId":"get_headers","tags":["data"],"parameters":[{"name":"headers","in":"query","required":true,"schema":{"type":"string","description":"raw email headers (paste the full block)"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"headers"},"result":{"type":"object","description":"headers output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Parse raw email headers into a hop timeline with delays, SPF/DKIM/DMARC results and source IP.","operationId":"post_headers","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"headers":{"type":"string","description":"raw email headers (paste the full block)"}},"required":["headers"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"headers"},"result":{"type":"object","description":"headers output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/timestamp":{"get":{"summary":"Convert between a Unix timestamp (seconds or milliseconds) and a human-readable UTC date.","operationId":"get_timestamp","tags":["data"],"parameters":[{"name":"value","in":"query","required":false,"schema":{"description":"a Unix timestamp or a date string; omit for the current time","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"timestamp"},"result":{"type":"object","description":"timestamp output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Convert between a Unix timestamp (seconds or milliseconds) and a human-readable UTC date.","operationId":"post_timestamp","tags":["data"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"description":"a Unix timestamp or a date string; omit for the current time","type":"string"}},"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"timestamp"},"result":{"type":"object","description":"timestamp output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/url":{"get":{"summary":"URL-encode or decode text (percent-encoding), in component or full-URL mode.","operationId":"get_url","tags":["data"],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"text to encode, or encoded text to decode"}},{"name":"mode","in":"query","required":false,"schema":{"description":"default encode","type":"string","enum":["encode","decode"]}},{"name":"full","in":"query","required":false,"schema":{"description":"treat as a full URL (encodeURI) instead of a component (default false)","type":"string"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"url"},"result":{"type":"object","description":"url output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"URL-encode or decode text (percent-encoding), in component or full-URL mode.","operationId":"post_url","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"text to encode, or encoded text to decode"},"mode":{"description":"default encode","type":"string","enum":["encode","decode"]},"full":{"description":"treat as a full URL (encodeURI) instead of a component (default false)","type":"string"}},"required":["text"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"url"},"result":{"type":"object","description":"url output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/yaml":{"get":{"summary":"Convert between JSON and YAML.","operationId":"get_yaml","tags":["data"],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"JSON or YAML source"}},{"name":"from","in":"query","required":false,"schema":{"description":"input format (default json)","type":"string","enum":["json","yaml"]}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"yaml"},"result":{"type":"object","description":"yaml output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Convert between JSON and YAML.","operationId":"post_yaml","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"JSON or YAML source"},"from":{"description":"input format (default json)","type":"string","enum":["json","yaml"]}},"required":["text"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"yaml"},"result":{"type":"object","description":"yaml output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/diff":{"get":{"summary":"Line-by-line diff of two texts, marking added, removed and unchanged lines.","operationId":"get_diff","tags":["data"],"parameters":[{"name":"a","in":"query","required":true,"schema":{"type":"string","description":"original text"}},{"name":"b","in":"query","required":true,"schema":{"type":"string","description":"changed text"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"diff"},"result":{"type":"object","description":"diff output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Line-by-line diff of two texts, marking added, removed and unchanged lines.","operationId":"post_diff","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"a":{"type":"string","description":"original text"},"b":{"type":"string","description":"changed text"}},"required":["a","b"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"diff"},"result":{"type":"object","description":"diff output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}},"/api/v1/tools/wordcount":{"get":{"summary":"Count characters, words, lines, sentences and paragraphs, with a reading-time estimate.","operationId":"get_wordcount","tags":["data"],"parameters":[{"name":"text","in":"query","required":true,"schema":{"type":"string","description":"text to analyze"}}],"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"wordcount"},"result":{"type":"object","description":"wordcount output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}},"post":{"summary":"Count characters, words, lines, sentences and paragraphs, with a reading-time estimate.","operationId":"post_wordcount","tags":["data"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"text":{"type":"string","description":"text to analyze"}},"required":["text"],"additionalProperties":false}}}},"responses":{"200":{"description":"tool result","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"tool":{"type":"string","const":"wordcount"},"result":{"type":"object","description":"wordcount output"}},"required":["ok","tool","result"]}}}},"400":{"$ref":"#/components/responses/Error"},"429":{"$ref":"#/components/responses/Error"},"502":{"$ref":"#/components/responses/Error"}}}}},"components":{"responses":{"Error":{"description":"error envelope","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"tool":{"type":"string"},"error":{"type":"string"},"code":{"type":"integer"}},"required":["ok","tool","error","code"]}}}}}},"x-mcp-endpoint":"https://invoker.tools/api/mcp"}