api reference

One index. Reach it over MCP or plain HTTP.

Every route returns typed, cited structure a model consumes directly. The MCP server is the front door most agents use; the same behaviour is one POST away for any runtime.

base url

All routes are served from the API host. Responses are JSON. Requests with a body are application/json.

base url
https://api.ipnops.xyz
the primary interface

MCP server

A Streamable-HTTP, stateless MCP server at POST /mcp. Add one connector and ipnops.search and ipnops.answer appear as tools inside your runtime. Each ships an outputSchema, so tool results arrive as typed structure — not text to re-parse.

~/.mcp/config
# one connector — Ipnops becomes an agent tool
{ "ipnops": {
    "transport": "http",
    "url": "https://api.ipnops.xyz/mcp"
  } }
tools/list ◂ result
{ "tools": [
  { "name": "search", "outputSchema": {…} },
  { "name": "answer", "outputSchema": {…} }
] }

A tools/call to answer returns the same AnswerResult shape documented under /answer as structuredContent.

grounded synthesis

POST /answer

Consolidates highlights into one grounded answer with Ipnops' own tiered reasoner. Markers are enforced per claim, each citation carries the evidence passage, and a deterministic faithfulness check reports whether every cited sentence is actually grounded.

querystringrequired — the question (1–1000 chars)
topKnumberoptional — highlights to synthesize over (1–20)
forceEscalatebooleanoptional — skip the floor rung, use the flagship reasoner
request · curl
curl -sS https://api.ipnops.xyz/answer \
  -H "content-type: application/json" \
  -d '{ "query": "who maintains sqlite?" }'
200 ◂ AnswerResult
{ "answer": "… [1] … [2]",
  "citations": [{ "marker": 1, "url": "…", "text": "…" }],
  "grounding": "own-index", "tier": "floor",
  "faithfulness": { "grounded": true } }

grounding is one of own-index, web, places, or none — the reach ladder falls through in that order and never fabricates when it misses.

growing the index

POST /index/seed

Grow the own index. Pass exactly one of seed (crawl one domain) or query (fan a free-text query across the discovery ladder and crawl what it finds).

seedstring (url)crawl one explicit domain — mutually exclusive with query
querystringfan out a free-text query and crawl discovered URLs
maxPagesnumberoptional — page cap per crawl (1–200)
maxSeedsnumberoptional — discovered URLs to crawl for a query seed (1–50)
purgebooleanoptional — drop the index before crawling (clean reseed)
request · curl
curl -sS https://api.ipnops.xyz/index/seed \
  -H "content-type: application/json" \
  -d '{ "query": "sqlite documentation", "maxSeeds": 5 }'
operations

Health & admin

GET/healthz

Liveness probe. Returns { status: 'ok' }.

GET/readyz

Readiness — reports sidecar + reasoner liveness.

POST/admin/migrate

Apply schema.sql (idempotent).

POST/index/purge

Drop the whole index.