TXLookup developer reference · MCP tools, agents, install, telemetry.
Everything you need to drop the TXLookup agent into Claude Code, Codex, or Cursor — plus the public surface area we expose. 6,061 datasets indexed across 6 portals · 9 deeply curated · MIT licensed. One screen, no docs maze.
One server, eight tools.
txlookup · v0.1.0 · MIT
TXLookup — Texas civic data agent
MCP server for Texas open civic data. Bounded discovery, scoped queries, citation-enforced summaries across Austin / Dallas / SA / Houston / TX state Socrata portals. Plus a multi-agent orchestrator (data analyst + reporter + support + critic + dataset scout).
- Transport
- stdio
- Command
- python -m mcp.server
- Repo
- github.com/ATX-TXLookup/TXLookup ↗
- License
- MIT
$ claude mcp add txlookup \ -- python -m mcp.server ✓ MCP server ‘txlookup’ added 8 tools registered
Eight tools. All citation-enforced.
discover_datasets
Find a relevant Texas civic dataset for a question. Returns up to 5 candidates from the curated catalog.
{
"query": "food truck permits 78702",
"city": "Austin"
}see source · mcp/server.py ↗get_dataset_schema
Inspect a dataset's columns, types, and field-name aliases before constructing a SoQL query. Always run this BEFORE fetch_data on a dataset you haven't queried recently.
{
"dataset_id": "3syk-w9eu"
}see source · mcp/server.py ↗fetch_data
Fetch up to 100 rows from a Texas Socrata dataset. SoQL `where` clause required for any scoped query (zip, date range). Cache-first: cached rows return in <50ms; live fetch falls back automatically when cache is cold.
{
"dataset_id": "3syk-w9eu",
"where": "original_zip='78702' AND issue_date >= '2026-01-01'",
"limit": 100
}see source · mcp/server.py ↗ask_data
End-to-end agent loop. Plain-English question → reason → plan → tool dispatch (with replan on failure + doom-loop guard + critic-driven revision) → cited synthesized answer. Wraps the multi-agent orchestrator (data analyst + reporter + critic).
{
"query": "Permits + violations spike together by zip this year"
}see source · mcp/server.py ↗get_task_status
Poll status of a long-running ask_data task started in async mode.
{
"task_id": "task_01HZ…"
}see source · mcp/server.py ↗create_miro_board
Create a Miro board for visualizing agent results. Returns board ID + URL.
{
"name": "78702 permits Q1",
"description": "Auto-built by ask_data"
}see source · mcp/server.py ↗add_to_miro
Post a structured payload (frame + sticky grid + chart card) to an existing Miro board.
{
"board_id": "uXjVM…",
"items": [
"frame",
"sticky_grid",
"chart_card"
]
}see source · mcp/server.py ↗list_known_tools
Self-introspection: returns this tool catalog. Useful for agents that load the server dynamically.
{}see source · mcp/server.py ↗Seven agents. One contract each.
Orchestrator
Plans & dispatches
Builds the plan, picks the specialist, runs the doom-loop guard.
On every /q request
Detail →Data Analyst
Statistical reasoning
Owns analytical SoQL — deltas, percentiles, top-N, YoY.
Triggered by orchestrator
Detail →Reporter
Composes /reports
Splices findings into long-form report templates.
On-demand + nightly cron
Detail →Support
Disambiguates & helps
Handles vague queries, returns chip-set follow-ups.
Triggered by orchestrator
Detail →Critic
Self-correction
Grades groundedness + scope; forces a corrective revision.
After every plan + answer
Detail →Dataset Scout
Grows the corpus
Scans Socrata portals for new datasets, files curation issues.
Every 6 hours
Detail →Ingestor
Local cache curator
Pulls dataset deltas into SQLite for cross-dataset SQL JOINs.
Every 6 hours
Detail →
Drop it in. Pick your client.
$ claude mcp add txlookup -- python -m mcp.server$ codex mcp add txlookup --command python --args -m --args mcp.server$ "txlookup": { "command": "python", "args": ["-m", "mcp.server"] }$ curl -N https://txlookup.vercel.app/api/agent \
-H 'content-type: application/json' \
-d '{"query":"food truck permits in 78702 last 6 months"}'Endpoints, for the curious.
| Method | Path | Purpose |
|---|---|---|
| POST | /api/agent | SSE stream — reason → plan → tool* → cited answer |
| GET | /api/admin/runs | List archived runs (auth-gated). ?hash=… for one. |
| POST | /api/admin/runs | Mark a run good | bad | pending. |
Run one. Watch the loop.
Live numbers, publicly visible.
Tools registered
8
Agents on the roster
7
Recent runs (visible)
50
from /api/admin/runs
Latest visible query
Which zip has the highest crime severity and lowest permit volume?
Telemetry pulls from /api/admin/runs · falls back to 0 when the archive isn’t readable to the public.