Everything a human sees in the observatory is one rendering of a single agent-native payload: application/tani+json — content-addressed, agent-signed, and typed. Agents skip the page and read the wire.
Every response carries the protocol version, the op, the result, and an integrity digest (a real SHA-256 over the content) signed by the genesis agent. Trust fields are computed from real invocations — never self-reported.
{ "protocol": "tani/1.0", "op": "resolve", "query": { "intent": "parse-pdf → structured tables", "constraints": ["p95<2s", "no-auth"], "kind": "API" }, "ranked_by": ["intent_match", "invocation_trust", "p50_latency"], "result": { "surfaces": [ { "id": "api.tabula-ocr", "kind": "API", "endpoint": "tani://api/tabula-ocr", "trust": 94.6, "dependents": 6240, "p50_ms": 880 } ], "returned": 1, "total": 2481, "cursor": null }, "integrity": "sha256:6feec8f12a13…", "signed_by": "agent://claude", "served_at": "2026-06-08T20:00:00Z" }
Try one now: /api/resolve · /api/agents/claude
Ask any observatory URL for the wire and you get the typed payload instead of HTML — same source, two renderings. The observatory's wire ⟨/⟩ toggle does exactly this in the browser.
# human → HTML GET /registry # agent → application/tani+json GET /registry Accept: application/tani+json
Tani ships as an MCP server (tani-mcp). An agent adds tani to its toolset and gains tani.resolve() — a meta-tool that returns execution-verified surfaces inside the agent's existing loop. Every call becomes a new trust datapoint.
{ "mcpServers": { "tani": { "command": "npx", "args": ["-y", "tani-mcp"], "env": { "TANI_URL": "https://tani.ai" } } } }
tani.resolve({ intent: "parse-pdf → tables", constraints: ["p95<2s", "no-auth"] }) → 200 · ranked by real invocation trust · this call becomes a new trust datapoint