Skip to main content
Glama

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 /health route, 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.

Discord

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)

search_opinions, search_dockets, search_dockets_with_documents, search_recap_documents, search_audio, search_people

Get (CourtListener)

get_opinion, get_docket, get_audio, get_court, get_person, get_cluster

Citation

citation_lookup_citation, citation_batch_lookup_citations, citation_verify_citation_format, citation_parse_citation_with_citeurl, citation_extract_citations_from_text, citation_enhanced_citation_lookup

eCFR (federal regulations)

ecfr_list_titles, ecfr_get_title_versions, ecfr_get_title_structure, ecfr_get_ancestry, ecfr_get_source_xml, ecfr_list_agencies, ecfr_list_all_corrections, ecfr_list_corrections_by_title, ecfr_search_regulations, ecfr_get_search_count, ecfr_get_search_summary, ecfr_get_title_search_counts, ecfr_get_daily_search_counts, ecfr_get_hierarchy_search_counts, ecfr_get_search_suggestions

System

status

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:

  1. Per-request header (BYOK) — preferred for hosted / shared deployments. 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 isn't already 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 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 http

Stdio (local CLI integration)

uv run python -m app --transport stdio

Add 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

COURT_LISTENER_API_KEY

Optional*

—

Fallback when no per-request header. Leave unset on public servers.

COURTLISTENER_BASE_URL

No

https://www.courtlistener.com/api/rest/v4/

COURTLISTENER_TIMEOUT

No

30

seconds

MCP_TRANSPORT

No

stdio

stdio | http | sse

MCP_PORT

No

8000

http/sse only

HOST

No

0.0.0.0

http/sse only

ECFR_BASE_URL

No

https://www.ecfr.gov

eCFR API base (no key required)

RATE_LIMIT_ENABLED

No

true

Per-client MCP rate limiting

RATE_LIMIT_RPS

No

15

Max requests/sec per client

RATE_LIMIT_BURST

No

40

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 JSON null no longer get a ValidationError (previously broke search_dockets / search_recap_documents).

  • Real pagination: removed the no-op hit param; search tools now honor limit and expose a next_cursor token plus an input cursor.

  • 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 behind RUN_INTEGRATION=1).

Credits & 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 tools
citation_batch_lookup_citationsA
Read-only
Inspect

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_lookupA
Read-only
Inspect

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_textA
Read-only
Inspect

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_citationA
Read-only
Inspect

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_citeurlA
Read-only
Inspect

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_formatA
Read-only
Inspect

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_ancestryA
Read-only
Inspect

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_countsA
Read-only
Inspect

Get search result counts broken down by date (daily histogram).

Inputs: query (required), date. Returns: object

ecfr_get_hierarchy_search_countsA
Read-only
Inspect

Get search result counts distributed across the CFR hierarchy.

Inputs: query (required), date. Returns: object

ecfr_get_search_countB
Read-only
Inspect

Get the total number of CFR sections matching a search query.

Inputs: query (required), date, title, agency_slugs. Returns: object

ecfr_get_search_suggestionsA
Read-only
Inspect

Get search-term suggestions for a partial CFR query.

Inputs: query (required). Returns: object

ecfr_get_search_summaryB
Read-only
Inspect

Get summary details (counts + metadata) for a CFR search query.

Inputs: query (required), date, title, agency_slugs. Returns: object

ecfr_get_source_xmlA
Read-only
Inspect

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_countsA
Read-only
Inspect

Get search result counts broken down by CFR title.

Inputs: query (required), date. Returns: object

ecfr_get_title_structureA
Read-only
Inspect

Get the full hierarchical structure (title -> section) of a CFR title on a date.

Inputs: date (required), title (required). Returns: object

ecfr_get_title_versionsA
Read-only
Inspect

List the available content versions (issue dates) for one CFR title.

Inputs: title (required). Returns: object

ecfr_list_agenciesA
Read-only
Inspect

List all agencies that appear in the CFR, with their title/chapter references.

Inputs: no named parameters. Returns: object

ecfr_list_all_correctionsB
Read-only
Inspect

List CFR corrections, optionally filtered by title and/or effective date.

Inputs: date, title. Returns: object

ecfr_list_corrections_by_titleA
Read-only
Inspect

List all corrections for a single CFR title.

Inputs: title (required). Returns: object

ecfr_list_titlesA
Read-only
Inspect

List all 50 CFR titles with their latest amended/issue dates and status.

Inputs: no named parameters. Returns: object

ecfr_search_regulationsA
Read-only
Inspect

Full-text search over federal regulations, returning matching sections with hierarchy.

Inputs: query (required), date, page, order, +3 more. Returns: object

get_audioA
Read-only
Inspect

Get oral argument audio information by ID from CourtListener.

Inputs: audio_id (required). Returns: object

get_clusterB
Read-only
Inspect

Get an opinion cluster by ID from CourtListener.

Inputs: cluster_id (required). Returns: object

get_courtB
Read-only
Inspect

Get court information by ID from CourtListener.

Inputs: court_id (required). Returns: object

get_docketA
Read-only
Inspect

Get a specific court docket by ID from CourtListener.

Inputs: docket_id (required). Returns: object

get_opinionA
Read-only
Inspect

Get a specific court opinion by ID from CourtListener.

Inputs: opinion_id (required). Returns: object

get_personA
Read-only
Inspect

Get judge or legal professional information by ID from CourtListener.

Inputs: person_id (required). Returns: object

search_audioB
Read-only
Inspect

Search oral argument audio recordings in CourtListener.

Inputs: q (required), court, judge, limit, +5 more. Returns: object

search_docketsB
Read-only
Inspect

Search federal cases (dockets) from PACER in CourtListener.

Inputs: q (required), court, limit, cursor, +6 more. Returns: object

search_dockets_with_documentsA
Read-only
Inspect

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_opinionsA
Read-only
Inspect

Search case law opinion clusters with nested Opinion documents in CourtListener.

Inputs: q (required), court, judge, limit, +7 more. Returns: object

search_peopleA
Read-only
Inspect

Search judges and legal professionals in the CourtListener database.

Inputs: q (required), name, limit, cursor, +6 more. Returns: object

search_recap_documentsA
Read-only
Inspect

Search federal filing documents from PACER in the RECAP archive.

Inputs: q (required), court, limit, cursor, +8 more. Returns: object

statusAInspect

Check the status of the CourtListener MCP server.

Returns: A dictionary containing server status, system metrics, and service information.

Inputs: no named parameters. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 34 tools

    Disambiguation5/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      A 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
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      A 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