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.
All routes are served from the API host. Responses are JSON. Requests with a body are application/json.
https://api.ipnops.xyzMCP 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.
# one connector — Ipnops becomes an agent tool
{ "ipnops": {
"transport": "http",
"url": "https://api.ipnops.xyz/mcp"
} }{ "tools": [
{ "name": "search", "outputSchema": {…} },
{ "name": "answer", "outputSchema": {…} }
] }A tools/call to answer returns the same AnswerResult shape documented under /answer as structuredContent.
POST /search
Hybrid retrieve over the own index: BM25 lexical + dense pgvector arms, fused with weighted RRF and reranked by a cross-encoder. Returns typed highlights, each self-citing its source passage.
curl -sS https://api.ipnops.xyz/search \
-H "content-type: application/json" \
-d '{ "query": "sqlite file format" }'{ "highlights": [{
"text": "…passage…", "score": 0.91,
"source": { "url": "…" } }],
"arms": { "lexical": true, "dense": true, "reranked": true } }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.
curl -sS https://api.ipnops.xyz/answer \
-H "content-type: application/json" \
-d '{ "query": "who maintains sqlite?" }'{ "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.
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).
curl -sS https://api.ipnops.xyz/index/seed \
-H "content-type: application/json" \
-d '{ "query": "sqlite documentation", "maxSeeds": 5 }'Health & admin
Liveness probe. Returns { status: 'ok' }.
Readiness — reports sidecar + reasoner liveness.
Apply schema.sql (idempotent).
Drop the whole index.