Skip to main content

Documentation Index

Fetch the complete documentation index at: https://vaquill.ai/docs/llms.txt

Use this file to discover all available pages before exploring further.

The CourtListener MCP server gives AI assistants direct access to the CourtListener legal database - US federal and state court opinions, dockets, RECAP filings, PACER data, oral arguments, and judges - plus the Electronic Code of Federal Regulations, all through the official CourtListener API v4. Vaquill hosts a public instance with bring-your-own-key (BYOK) auth, so your CourtListener token is forwarded on every request and never stored.

GitHub

Source code, Docker images, issues

CourtListener API

Upstream API docs and free key signup

Hosted endpoint

courtlistener-mcp.vaquill.ai
Forked from Travis-Prall/court-listener-mcp. The Vaquill fork adds a hosted endpoint, BYOK auth, a /health route, and production Docker hardening. Tools and search semantics are unchanged.

Quickstart

1

Get a free CourtListener token

Sign up at courtlistener.com/help/api/rest/ and copy your API key. The Free Law Project does not charge for API access.
2

Point your client at the hosted endpoint

URL: https://courtlistener-mcp.vaquill.ai/mcp/Header: X-CourtListener-Token: <your-token>
3

Ask your assistant

Try: “Search for Supreme Court opinions on qualified immunity from the last two terms.”
The hosted server never sees or stores your CourtListener key - it is forwarded on every request to courtlistener.com and your usage hits your own quota.

Client setup

{
  "mcpServers": {
    "courtlistener": {
      "url": "https://courtlistener-mcp.vaquill.ai/mcp/",
      "headers": {
        "X-CourtListener-Token": "YOUR_COURTLISTENER_TOKEN"
      }
    }
  }
}
Any client that supports MCP streamable HTTP with custom headers works. For stdio-only clients, run the server locally (see Self-hosting) or proxy with mcp-remote.

Tools

ToolDescription
search_opinionsFull-text search across court opinions with court, date, judge, and citation filters
search_docketsSearch dockets by case name, court, judge, party, or date range
search_dockets_with_documentsSame as search_dockets but only returns dockets with PACER documents attached
search_recap_documentsSearch RECAP-archived PACER filings (briefs, motions, orders)
search_audioOral argument audio recordings
search_peopleFederal and state judges, with biographical and political data

Get by ID

ToolDescription
get_opinionFull text and metadata for a single opinion
get_docketFull docket record including parties and event timeline
get_audioOral argument audio file metadata and download URL
get_courtCourt metadata (jurisdiction, position in hierarchy, dates of operation)
get_personJudge biography, education, appointments, political affiliation
get_clusterOpinion cluster - groups majority, concurrence, and dissent for a single decision

Citations

ToolDescription
lookup_citationResolve a single citation string to the canonical opinion
batch_lookup_citationsBulk variant - resolve up to 100 citations in one call
verify_citation_formatValidate Bluebook citation format without hitting the database
parse_citation_with_citeurlUse the citeurl library to parse complex citation strings
extract_citations_from_textExtract all citations from a block of text
enhanced_citation_lookupCombines extraction, parsing, and lookup in a single call

eCFR

ToolDescription
list_titlesList all 50 titles of the Code of Federal Regulations
list_agenciesList federal agencies with their CFR title assignments
search_regulationsFull-text search across the eCFR
list_all_correctionsRecent CFR corrections (errata)
list_corrections_by_titleCorrections scoped to a single CFR title
get_search_suggestionsAutocomplete suggestions for the search bar
get_search_summaryAggregate stats for a search query
get_title_search_countsHit counts per CFR title for a query
get_daily_search_countsDaily hit-count time series for a query
get_ancestryHierarchical ancestry for a CFR section (title > chapter > part > section)
get_title_structureFull table of contents for a CFR title
get_source_xmlRaw XML source for a CFR section
get_source_jsonParsed JSON source for a CFR section

System

ToolDescription
statusHigh-level server status string
get_api_statusDetailed CourtListener API connectivity check
health_checkLiveness probe (returns { "status": "healthy" })

Authentication

Two modes, in priority order:
  1. Per-request header (BYOK, preferred) - send the user’s CourtListener key on every MCP request:
    • X-CourtListener-Token: <key> (preferred), or
    • Authorization: Token <key> (CourtListener’s native scheme - only works if the MCP server itself is not gated by Authorization).
  2. Server env fallback - set COURT_LISTENER_API_KEY on the server. Used when no per-request header is supplied. Leave unset on public instances to force BYOK.
If neither is provided, tools return a ValueError with a clear message.
The Vaquill-hosted endpoint is BYOK only - calls without X-CourtListener-Token (or the Authorization: Token fallback) will be rejected. This protects the operator’s API quota and keeps usage tied to your CourtListener account.

Self-hosting

Docker

git clone https://github.com/Vaquill-AI/courtlistener-mcp.git
cd courtlistener-mcp
cp .env.example .env   # optionally set COURT_LISTENER_API_KEY for single-tenant
docker compose up -d
# server at http://localhost:8000/mcp/

Python (uv)

uv sync
uv run python -m app --transport http

Stdio (local CLI integration)

uv run python -m app --transport stdio
Wire stdio into Claude Desktop:
{
  "mcpServers": {
    "courtlistener-local": {
      "command": "uv",
      "args": [
        "run", "--directory", "/abs/path/to/courtlistener-mcp",
        "python", "-m", "app", "--transport", "stdio"
      ],
      "env": { "COURT_LISTENER_API_KEY": "your_token" }
    }
  }
}

Environment variables

VariableRequiredDefaultDescription
COURT_LISTENER_API_KEYOptional*-Server-side fallback when no per-request header. Leave unset on public servers to force BYOK.
COURTLISTENER_BASE_URLNohttps://www.courtlistener.com/api/rest/v4/Upstream API root
COURTLISTENER_TIMEOUTNo30Per-request timeout in seconds
MCP_TRANSPORTNostdiostdio, http, or sse
MCP_PORTNo8000HTTP / SSE only
HOSTNo0.0.0.0HTTP / SSE only
* Required only in single-tenant mode without BYOK.

Health check

curl https://courtlistener-mcp.vaquill.ai/health
# {"status":"healthy","service":"courtlistener-mcp","version":"..."}

Usage examples

Type these to any connected AI assistant:
“Search for Supreme Court opinions on qualified immunity from the last two terms.” “Look up docket 23-1234 in the Southern District of New York and list the filings since January.” “Find all cases citing Miranda v. Arizona and group by circuit.” “Verify the citation format 410 U.S. 113 and resolve it to the canonical opinion.” “Extract every citation from this brief, then look each one up:” (paste text) “Pull the eCFR text for 17 CFR 240.10b-5 and list any 2024 corrections.” “Show me Judge Stephen Breyer’s biography and the courts he sat on.”

MCP overview

All Vaquill MCP servers at a glance

Vaquill MCP

Cross-jurisdiction wrapper over the Vaquill API

Integrations

Chatbots, widgets, browser extensions, automation

Authentication

How Vaquill handles auth across products
CourtListener data is provided by the Free Law Project under their respective terms.