The deterministic fact-verification layer for AI agents.
Agents confidently emit IBANs, phone numbers, domains, VAT numbers and crypto addresses that are subtly — and silently — wrong. Qiniso checks them against checksums and curated authoritative data, so a wrong answer is caught, not trusted. "Qiniso" means "truth" in Zulu.
Security and structure guardrails check whether an answer is safe or well-formed. Hallucination guardrails ask another LLM whether it's faithful to the prompt. None of them check whether a structured fact is actually correct against the real world — because that needs deterministic computation or curated data, not another model's opinion. That's Qiniso.
It verifies facts you give it; it is not a live-data provider and never asks for your credentials.
IBAN, payment card (Luhn + brand), ISBN-13, VIN, GTIN/UPC/EAN barcodes (+ GS1 country).
TLD & domain (IANA root zone), IP, UUID, URL, email.
ISIN, CUSIP, SEDOL, LEI, US ABA routing.
Ethereum (EIP-55) & Bitcoin (Base58Check / Bech32) addresses.
24 countries — Brazil, Spain, India, Italy, Poland, Netherlands, Belgium, Nordics, Portugal, Turkey, China, Germany, France, Switzerland, Mexico, Croatia, Romania, Bulgaria, Estonia, Czechia, EU/UK VAT.
ISBN-10, ISSN, ORCID.
Phone (global), date parsing, currency, holidays (~200 countries), UK VAT-by-date.
UK/US address parsing into structured fields.
Easiest — one click, no config file. Download the Desktop Extension and open it; Claude Desktop installs it in one click:
Download for Claude Desktop (.mcpb)
Settings → Connectors → Add custom connector, and paste the URL. Hosted on the edge, no login, no key:
https://qiniso.qinisolabs.workers.dev/mcp
Prefer no dependency on the hosted endpoint? Run it yourself over stdio — add this to your MCP client config (e.g. Claude Desktop → Settings → Developer → Edit Config), then restart:
{
"mcpServers": {
"qiniso": { "command": "npx", "args": ["-y", "@qinisolabs/qiniso"] }
}
}
Using asdf or nvm? The desktop app may not see npx on its PATH — replace "npx" with the full path from which npx.
Every check is also a typed function — no MCP required:
npm i @qinisolabs/qiniso
import { validateIban, validateVat } from "@qinisolabs/qiniso";
validateIban("GB82 WEST 1234 5698 7654 32"); // { valid: true, country: "United Kingdom", ... }