API reference · free · no key
Every endpoint, with the line that calls it
Everything here is live and free. Retrieval and ranking are deterministic: same question, same results. The one language model in the system writes the single-sentence pick behind answer=1, and it may only choose among labelled results, never change a label. An honest no is an answer. The same calls are MCP tools; the index behind them is machine-checked weekly and Ed25519-signed, see how we check.
The headline call
/api/v1/find?q=…&k=10&answer=1Find the tool action that does this
Describe what you need in plain words; get the products that do it, each with its best actions, read from 2.2 million tools inside MCP servers, APIs, CLIs, SDKs, models, robots and devices and from the makers' own pages. Products are the documents and their actions the passages; word and meaning search at both levels, one reranker, measured use beside it. Every result carries its label: verified and signed · official · found in code, not yet checked · website read, tools not yet checked · demo or tutorial · failed its last check. Labels are the instruments' verdict and are never changed by ranking.
With answer=1 the answer names three to six products, one sentence each, every claim cited to the maker's own page with the date we read it, plus the links to its docs, pricing and sign-up. Products whose own page says they are retired are left out and listed. A demo or failed result is never offered while anything else fits. If the search service is down the call returns 503, never a guess.
curl "https://unfragile.ai/api/v1/find?q=refund+a+stripe+payment&answer=1"
/api/answer?q=…One verified answer
Ask what you need; get ONE pick with evidence — verification tier, score, signed passport, freshness, adoption — plus a paste-ready install command, honest alternatives, and the pick's evidence page. If nothing in the verified corpus covers the query confidently, answer is null and noConfidentAnswer.reason says so. Trust the abstention: it is the feature.
curl "https://unfragile.ai/api/answer?q=stripe+payments"
The agent surface — /api/v1
/api/v1/search?q=…&limit=5Ranked results with per-record evidence
The same deterministic scoring as the answer, as a list. Each result carries its envelope, verification status/score, signed-passport flag, adoption, declared tools, install command, and its unfragile.ai evidence page.
curl "https://unfragile.ai/api/v1/search?q=postgres&limit=5"
/api/v1/resolveAgent-runtime resolution: intent → one verified record
One intent in, one verified record out — with a conservative verdict, the Ed25519- signed passport attached, and the invocation snippet, in a single round trip. Honest abstention when nothing qualifies: do not invoke a guess.
curl -X POST https://unfragile.ai/api/v1/resolve \
-H "Content-Type: application/json" \
-d '{"intent": "send a slack message from an agent"}'/api/v1/verifyVerify before invoke
The trust primitive. Returns one verdict — trusted · caution · unverified · flagged — with the record's signed passport. Conservative by design: an unknown target is never trusted. Rule for agents: never invoke a flagged target; treat unverified as review-first.
curl -X POST https://unfragile.ai/api/v1/verify \
-H "Content-Type: application/json" \
-d '{"target": "npm:@stripe/mcp"}'/api/v1/passport/{slug}The raw signed trust passport
The Ed25519-signed passport for any record — by page slug, record id, or package name. Verify it offline: fetch the public key from /api/v1/trust-passport-public-key, detach signature/signedAt/signedBy/version, canonicalize the rest with sorted keys, and run ed25519-verify. Copy-paste verifier: /how#verify.
curl "https://unfragile.ai/api/v1/passport/stripe-mcp"
/api/v1/statsThe live census, as JSON
Honest-tier counts for the whole corpus: listed, verified, signed passports, official records, by envelope.
curl "https://unfragile.ai/api/v1/stats"
For agents: install the MCP server instead
The calls above ship as seven MCP tools — unfragile_find · unfragile_answer · unfragile_search · unfragile_verify · unfragile_resolve · unfragile_passport · unfragile_stats — in @unfragile/mcp-server. One command wires them into Claude Code; any other MCP client takes the configuration block on the agent page:
claude mcp add unfragile -- npx -y @unfragile/mcp-server
Details and per-client setup: /mcp · one-line install: /install.sh · for agents as markdown: /agents.md · for robots: /robots.md · OpenAPI description (for ChatGPT Actions, SDK generators): /openapi.json · machine-readable site guide: /llms.txt
The command line
The same package ships the unfragile command: verify prints a signed verdict for a package or MCP server, guard wraps an install command and blocks a flagged target. If the service is unreachable it says so and treats the target as unverified; it never fails open.
npx -p @unfragile/mcp-server unfragile verify npm:postmark-mcp npx -p @unfragile/mcp-server unfragile guard -- claude mcp add pg -- npx -y @scope/pg-mcp
Ground rules
- Free, no key. Every endpoint here is open.
- Deterministic retrieval. Same query, same results; every ranking reproducible. The only model is the one-sentence answer layer, and it cannot change a label or promote a demo or failed result.
- Honest tiers.
static-verified= contract machine-checked;execution-verified= we ran it in our sandbox and it worked; "not yet verified" is never "failed".