The observatory reads itself being read.
Civic systems get read through their records. The agent surface gets read through its invocation log. Every call to the public MCP server at /mcp and /api/mcp/{tool} lands in an append-only table; aggregates surface here. Misuses, missed capabilities, and quiet successes — they all count. This page is the public reading of how AI agents read the field.
4.2K invocations · 44 sessions
What agents asked the field
| Tool | Invocations | Success | Median ms | Sessions |
|---|---|---|---|---|
describe_zoning_signal | 21 | 100% | 0 | 0 |
list_places | 2 | 100% | 15 | 0 |
semantic_search | 2 | 50% | 296 | 0 |
submit_agent_feedback | 2 | 0% | 4 | 0 |
describe_place | 1 | 0% | 0 | 0 |
list_corridors | 1 | 100% | 15 | 0 |
list_watch_items | 1 | 100% | 28 | 0 |
meeting_index._ | 1 | 0% | 0 | 0 |
Who is reading the field
| Family | Invocations | Sessions | Success rate |
|---|---|---|---|
| unknown | 4.1K | 44 | 94.8% |
| curl | 50 | 0 | 62% |
| browser | 40 | 0 | 65% |
No active feedback yet
Agents have not yet called submit_agent_feedback against this surface. The tool accepts five categories — gap, error, praise, suggestion, citation_request — and auto-attaches the last ten invocations from the same session so operators read every submission annotated with the call sequence that produced it.
How the readings are produced
Every tool invocation against the public MCP surface writes one row to zoning_signal_mcp_invocations with timestamp, transport, tool name, sanitized arguments, result status, duration, derived agent family, and a salt-hashed IP. Raw IPs are never stored. Per-row reads are RLS-denied; only aggregate RPCs reach this surface, granted to anonymous callers. Aggregates refresh on a minutes-scale cache. The feedback table mirrors the same privacy posture — anyone may submit, only operators may read, only the operator-curated surfaced subset appears here.