courtlistener-mcp
Access U.S. federal and state court data plus eCFR federal regulations through read-only MCP tools.
Search CourtListener for opinions, dockets, dockets with documents, RECAP filings, oral argument audio, and judges/legal professionals.
Retrieve specific CourtListener records by ID: opinion, docket, audio, cluster, person, and court.
Work with legal citations: lookup, batch lookup, verify format, parse with citeurl, extract citations from text, and enhanced lookup.
Explore eCFR federal regulations: list titles, versions, structure, ancestry, source XML, agencies, and corrections.
Search eCFR regulations with full-text queries, plus get counts, summaries, title/daily/hierarchy breakdowns, and suggestions.
Check server status and health.
Use cursor-based pagination on search tools, per-client rate limiting, and BYOK header authentication.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@courtlistener-mcp look up citation 410 U.S. 113"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
CourtListener MCP Server
A Model Context Protocol server that gives AI assistants access to the CourtListener legal database (US federal + state court opinions, dockets, RECAP filings, PACER data, oral arguments, judges) and the Electronic Code of Federal Regulations via the official CourtListener API v4.
Use it with Claude Desktop, Claude Code, Cursor, VS Code, Windsurf, ChatGPT Desktop, or any MCP-compatible client.
Forked from Travis-Prall/court-listener-mcp. This fork adds a hosted endpoint, bring-your-own-key (BYOK) auth, a
/healthroute, Dockerfile hardening, a full eCFR (federal regulations) tool suite, cursor pagination, per-client rate limiting, and read-only tool annotations. See the changelog for details.
When to use this vs. the official server
Free Law Project (who run CourtListener) host an official MCP at
https://mcp.courtlistener.com/ (OAuth, free with any CourtListener account) -
see their announcement.
Prefer it if you want OAuth and the broadest CourtListener coverage. Use this
server if you want: eCFR federal-regulations tools (the official server has
none), simple BYOK header auth (no OAuth dance), or a self-hosted/embeddable
Python server. The two are complementary.
Use the hosted endpoint (no install)
The Vaquill team runs a public instance for the community:
https://courtlistener-mcp.vaquill.ai/mcp/You bring your own free CourtListener token from courtlistener.com/help/api/rest/, the server forwards it. We never see or store your key.
Claude Desktop / Claude Code
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or
%APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"courtlistener": {
"url": "https://courtlistener-mcp.vaquill.ai/mcp/",
"headers": {
"X-CourtListener-Token": "YOUR_COURTLISTENER_TOKEN"
}
}
}
}Cursor
.cursor/mcp.json:
{
"mcpServers": {
"courtlistener": {
"url": "https://courtlistener-mcp.vaquill.ai/mcp/",
"headers": { "X-CourtListener-Token": "YOUR_COURTLISTENER_TOKEN" }
}
}
}VS Code (GitHub Copilot Chat)
.vscode/mcp.json:
{
"servers": {
"courtlistener": {
"type": "http",
"url": "https://courtlistener-mcp.vaquill.ai/mcp/",
"headers": { "X-CourtListener-Token": "YOUR_COURTLISTENER_TOKEN" }
}
}
}Claude Web (custom connector)
Settings → Connectors → Add custom connector → paste the URL and add
X-CourtListener-Token as a header. Workspace owners only.
Windsurf, Continue, etc.
Any client that supports MCP streamable HTTP with custom headers works.
For stdio-only clients, run the server locally (see below) or proxy with
mcp-remote.
Related MCP server: courtlistener-mcp
Tools
34 tools across 4 groups (each group is namespaced). All are read-only.
Group | Tools |
Search (CourtListener) |
|
Get (CourtListener) |
|
Citation |
|
eCFR (federal regulations) |
|
System |
|
Search tools accept a cursor param and return a next_cursor for pagination.
See app/README.md for full parameter details.
Authentication
Two modes, in priority order:
Per-request header (BYOK) — preferred for hosted / shared deployments. Send the user's CourtListener key on every MCP request:
X-CourtListener-Token: <key>(preferred), orAuthorization: Token <key>(CourtListener's native scheme — only works if the MCP server itself isn't already gated byAuthorization).
Server env fallback — set
COURT_LISTENER_API_KEYon the server. Used when no per-request header is supplied. Leave unset on public instances to force BYOK and avoid burning the operator's quota.
If neither is provided, tools return a ValueError with a clear message.
Self-host
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 httpStdio (local CLI integration)
uv run python -m app --transport stdioAdd to 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" }
}
}
}Configuration
Var | Required | Default | Notes |
| Optional* | — | Fallback when no per-request header. Leave unset on public servers. |
| No |
| |
| No |
| seconds |
| No |
|
|
| No |
| http/sse only |
| No |
| http/sse only |
| No |
| eCFR API base (no key required) |
| No |
| Per-client MCP rate limiting |
| No |
| Max requests/sec per client |
| No |
| Burst capacity per client |
* Required only if running in single-tenant mode without BYOK.
Health check
curl https://courtlistener-mcp.vaquill.ai/health
# {"status":"healthy","service":"courtlistener-mcp","version":"..."}Development
uv sync --dev
uv run pytest
uv run ruff format . && uv run ruff check .
uv run mypy app/Changelog
0.2.0
Added a full eCFR (federal regulations) tool suite (15 tools): titles, structure, versions, ancestry, source XML, agencies, corrections, and full-text regulation search + analytics. This is the differentiator over CourtListener-only servers.
Fixed a validation crash: optional search filters are now nullable (
str | None), so clients that send explicit JSONnullno longer get aValidationError(previously brokesearch_dockets/search_recap_documents).Real pagination: removed the no-op
hitparam; search tools now honorlimitand expose anext_cursortoken plus an inputcursor.Read-only tool annotations on all tools (better client UX, no write prompts).
Per-client rate limiting middleware (configurable, on by default).
Migrated
import_server→mount(FastMCP 3), fixed the API-key env-var alias, refreshed project metadata, and got the test suite green (unit tests mocked; live-API tests gated behindRUN_INTEGRATION=1).
Credits & License
Original implementation: Travis-Prall/court-listener-mcp
Hosted by: Vaquill — courtlistener-mcp.vaquill.ai
License: MIT (see LICENSE)
CourtListener data is provided by the Free Law Project under their respective terms. eCFR data is from ecfr.gov.
Community
Questions, ideas, or want to contribute? Join the Vaquill community on Discord.
Available Tools
34 toolscitation_batch_lookup_citationsARead-onlyInspect
Look up multiple legal citations in a single request.
This is more efficient than making individual requests for each citation. Accepts up to 100 citations at once.
Inputs: citations (required). Returns: object
citation_enhanced_citation_lookupARead-onlyInspect
Enhanced citation lookup combining citeurl parsing with CourtListener data.
This tool first uses citeurl to parse and validate the citation format, then optionally queries the CourtListener API for additional case information.
Inputs: citation (required), include_courtlistener. Returns: object
citation_extract_citations_from_textARead-onlyInspect
Extract all legal citations from a block of text using citeurl.
This tool finds and parses all legal citations within a given text, including both long-form and short-form citations (like 'id.' references).
Inputs: text (required). Returns: object
citation_lookup_citationARead-onlyInspect
Look up a legal citation to find the opinion it references in CourtListener.
This tool accepts various citation formats including:
U.S. Reporter citations (e.g., "410 U.S. 113")
Federal Reporter citations (e.g., "123 F.3d 456")
WestLaw citations (e.g., "2023 WL 12345")
State reporter citations
Inputs: citation (required). Returns: object
citation_parse_citation_with_citeurlARead-onlyInspect
Parse a legal citation using citeurl's advanced citation recognition.
This tool uses the citeurl library to parse legal citations and extract structured information including tokens, normalized format, and URL generation.
Returns detailed information about the citation including:
Recognized citation format and source
Extracted tokens (volume, reporter, page, etc.)
Generated URL if available
Normalized citation text
Inputs: citation (required), broad. Returns: object
citation_verify_citation_formatARead-onlyInspect
Verify if a citation string is in a valid format using citeurl's advanced parsing.
This tool performs validation using citeurl's comprehensive citation templates to check if a citation appears to be in a recognized legal citation format. This is much more accurate than simple regex matching.
Returns information about the citation format and any detected issues.
Inputs: citation (required). Returns: object
ecfr_get_ancestryARead-onlyInspect
Get the ancestry chain (title -> ... -> node) for a CFR node on a date.
Inputs: date (required), title (required), part, section. Returns: object
ecfr_get_daily_search_countsARead-onlyInspect
Get search result counts broken down by date (daily histogram).
Inputs: query (required), date. Returns: object
ecfr_get_hierarchy_search_countsARead-onlyInspect
Get search result counts distributed across the CFR hierarchy.
Inputs: query (required), date. Returns: object
ecfr_get_search_countBRead-onlyInspect
Get the total number of CFR sections matching a search query.
Inputs: query (required), date, title, agency_slugs. Returns: object
ecfr_get_search_suggestionsARead-onlyInspect
Get search-term suggestions for a partial CFR query.
Inputs: query (required). Returns: object
ecfr_get_search_summaryBRead-onlyInspect
Get summary details (counts + metadata) for a CFR search query.
Inputs: query (required), date, title, agency_slugs. Returns: object
ecfr_get_source_xmlARead-onlyInspect
Fetch the source regulation TEXT (XML) for a CFR node on a snapshot date.
Pass a part or section to scope the request. Fetching an entire large title
at once can time out on the eCFR side, so narrowing is strongly recommended.
Returns the raw XML under content_xml.
Inputs: date (required), title (required), part, chapter, +5 more. Returns: object
ecfr_get_title_search_countsARead-onlyInspect
Get search result counts broken down by CFR title.
Inputs: query (required), date. Returns: object
ecfr_get_title_structureARead-onlyInspect
Get the full hierarchical structure (title -> section) of a CFR title on a date.
Inputs: date (required), title (required). Returns: object
ecfr_get_title_versionsARead-onlyInspect
List the available content versions (issue dates) for one CFR title.
Inputs: title (required). Returns: object
ecfr_list_agenciesARead-onlyInspect
List all agencies that appear in the CFR, with their title/chapter references.
Inputs: no named parameters. Returns: object
ecfr_list_all_correctionsBRead-onlyInspect
List CFR corrections, optionally filtered by title and/or effective date.
Inputs: date, title. Returns: object
ecfr_list_corrections_by_titleARead-onlyInspect
List all corrections for a single CFR title.
Inputs: title (required). Returns: object
ecfr_list_titlesARead-onlyInspect
List all 50 CFR titles with their latest amended/issue dates and status.
Inputs: no named parameters. Returns: object
ecfr_search_regulationsARead-onlyInspect
Full-text search over federal regulations, returning matching sections with hierarchy.
Inputs: query (required), date, page, order, +3 more. Returns: object
get_audioARead-onlyInspect
Get oral argument audio information by ID from CourtListener.
Inputs: audio_id (required). Returns: object
get_clusterBRead-onlyInspect
Get an opinion cluster by ID from CourtListener.
Inputs: cluster_id (required). Returns: object
get_courtBRead-onlyInspect
Get court information by ID from CourtListener.
Inputs: court_id (required). Returns: object
get_docketARead-onlyInspect
Get a specific court docket by ID from CourtListener.
Inputs: docket_id (required). Returns: object
get_opinionARead-onlyInspect
Get a specific court opinion by ID from CourtListener.
Inputs: opinion_id (required). Returns: object
get_personARead-onlyInspect
Get judge or legal professional information by ID from CourtListener.
Inputs: person_id (required). Returns: object
search_audioBRead-onlyInspect
Search oral argument audio recordings in CourtListener.
Inputs: q (required), court, judge, limit, +5 more. Returns: object
search_docketsBRead-onlyInspect
Search federal cases (dockets) from PACER in CourtListener.
Inputs: q (required), court, limit, cursor, +6 more. Returns: object
search_dockets_with_documentsARead-onlyInspect
Search federal cases (dockets) with up to three nested documents.
If there are more than three matching documents, the more_docs field will be true.
Inputs: q (required), court, limit, cursor, +6 more. Returns: object
search_opinionsARead-onlyInspect
Search case law opinion clusters with nested Opinion documents in CourtListener.
Inputs: q (required), court, judge, limit, +7 more. Returns: object
search_peopleARead-onlyInspect
Search judges and legal professionals in the CourtListener database.
Inputs: q (required), name, limit, cursor, +6 more. Returns: object
search_recap_documentsARead-onlyInspect
Search federal filing documents from PACER in the RECAP archive.
Inputs: q (required), court, limit, cursor, +8 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 34 tools
Each tool has a distinct and well-described purpose. Citation tools cover different operations (lookup, batch, verify, parse, extract, enhanced lookup). eCFR tools each handle a separate task (list titles, get versions, structure, ancestry, search, counts, etc.). General CourtListener tools are clearly separated by resource and action (search vs get, opinions vs dockets vs audio vs people). No two tools appear to overlap in functionality.
Tools are grouped with clear prefixes: 'citation_' for citation tools, 'ecfr_' for eCFR tools, and unprefixed verb+noun for general tools (e.g., get_court, search_opinions). Within each group, naming follows a consistent verb_noun pattern. The only minor inconsistency is the lack of a common prefix for general tools, but this is acceptable given the distinct functional areas.
With 34 tools, the count exceeds the recommended range for a well-scoped server (3-15). While the server covers three broad legal domains (citations, eCFR, CourtListener), the tool surface is quite large and could potentially be split into separate servers for better focus. Many tools are very granular, especially for eCFR search counts and hierarchies.
The tool set covers the major operations for legal research: citation handling (lookup, batch, parsing, validation, extraction), eCFR retrieval and search (titles, versions, structure, ancestry, corrections, full-text search with counts), and CourtListener data access (search and get for opinions, dockets, audio, people, courts, RECAP documents). Minor gaps might include advanced filtering or sorting options, but overall the surface is comprehensive for the intended use.
Maintenance
Related MCP Connectors
CourtListener MCP — Free Law Project's CourtListener API (v4).
Connect AI to millions of laws and court cases with the Lawstronaut MCP.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP Server providing AI agents access to over 3 million US court decisions via CourtListener and EU legislation via EUR-Lex, with tools for searching cases, citations, judges, and court information.6MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server providing AI agents access to CourtListener's comprehensive legal database, featuring semantic search, hybrid search, citation verification, and research tools.7MIT
- FlicenseNot gradedqualityDmaintenanceA comprehensive Model Context Protocol (MCP) server for accessing CourtListener's legal database. Provides Claude Desktop with powerful legal research capabilities including court opinions, case dockets, judge profiles, and comprehensive legal analysis.1-
- AlicenseNot gradedqualityDmaintenanceA remotely callable MCP server for US legal research that provides tools to search, retrieve, and analyze US case law from the CourtListener API, enabling agents to build evidence packs from primary sources without generating legal content.MIT