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
$ 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-code · install MCP
$ claude mcp add txlookup -- python -m mcp.server
codex · install MCP
$ codex mcp add txlookup --command python --args -m --args mcp.server
cursor · settings.json
$ "txlookup": { "command": "python", "args": ["-m", "mcp.server"] }
curl · ask the agent
$ 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.

MethodPathPurpose
POST/api/agentSSE stream — reason → plan → tool* → cited answer
GET/api/admin/runsList archived runs (auth-gated). ?hash=… for one.
POST/api/admin/runsMark a run good | bad | pending.

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.