CourtListener sits on 9 million US court opinions and this server exposes the full dataset through 12 tools. You can full-text search opinions with field-level filters, pull complete case text with all opinion variants (majority, concurrence, dissent), and traverse citation networks in both directions to map precedent chains. It also covers RECAP federal dockets with party and attorney search, judge biographical records including appointment history and financial disclosures, and oral argument audio with transcripts. The free tier gives you 125 requests per day, which is enough for targeted research but tight for deep citation traversal. Runs over stdio or as a hosted HTTP endpoint at courtlistener.caseyjhand.com/mcp.
claude mcp add --transport http courtlistener https://courtlistener.caseyjhand.com/mcpRun in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
courtlistener_search_opinionsFull-text search across 9M+ written US court opinions with field-level filtering. Returns opinion cluster summaries with case metadata, citations, and matched text snippets. Supports CourtListener field syntax (caseName:"roe v wade", court_id:scotus, judge:"Alito") and boolean...8 paramsFull-text search across 9M+ written US court opinions with field-level filtering. Returns opinion cluster summaries with case metadata, citations, and matched text snippets. Supports CourtListener field syntax (caseName:"roe v wade", court_id:scotus, judge:"Alito") and boolean...
q*stringcourtstringcursorstringstatusstringPublished · Unpublished · Errata · Separate · In-chambers · Relating-toorder_bystringscore desc · dateFiled desc · dateFiled asc · citeCount descdefault: score descpage_sizeintegerfiled_afterstringfiled_beforestringcourtlistener_get_opinionFetch the full text and metadata for a single opinion cluster by cluster ID. A cluster groups all opinions filed in a case — majority, concurrence, dissent, and per curiam. Returns all opinion variants with HTML and plain text. Obtain cluster IDs from courtlistener_search_opin...1 paramsFetch the full text and metadata for a single opinion cluster by cluster ID. A cluster groups all opinions filed in a case — majority, concurrence, dissent, and per curiam. Returns all opinion variants with HTML and plain text. Obtain cluster IDs from courtlistener_search_opin...
cluster_id*integercourtlistener_get_citationsRetrieve the citation network for an opinion cluster. Supports two directions: "cited_by" (opinions that cite this one — measures precedential influence) and "citing" (opinions this one cites — reveals the authority chain relied on). This is the primary tool for tracing legal...6 paramsRetrieve the citation network for an opinion cluster. Supports two directions: "cited_by" (opinions that cite this one — measures precedential influence) and "citing" (opinions this one cites — reveals the authority chain relied on). This is the primary tool for tracing legal...
courtstringcursorstringdirectionstringciting · cited_bydefault: cited_bypage_sizeintegercluster_id*integerfiled_afterstringcourtlistener_lookup_citationResolve a formatted legal citation string (e.g., "410 U.S. 113", "93 S. Ct. 705") to a cluster ID and case metadata. Enables workflows that start from a known citation rather than a search query. Supports standard US reporter formats. Requires authentication — uses the CourtLi...1 paramsResolve a formatted legal citation string (e.g., "410 U.S. 113", "93 S. Ct. 705") to a cluster ID and case metadata. Enables workflows that start from a known citation rather than a search query. Supports standard US reporter formats. Requires authentication — uses the CourtLi...
citation*stringcourtlistener_search_docketsSearch RECAP federal court dockets with party name, attorney, court, and date filters. RECAP is a crowd-sourced mirror of PACER (the federal court filing system) — coverage varies by court and date. Returns docket metadata with up to 3 sample document entries per docket. Use c...7 paramsSearch RECAP federal court dockets with party name, attorney, court, and date filters. RECAP is a crowd-sourced mirror of PACER (the federal court filing system) — coverage varies by court and date. Returns docket metadata with up to 3 sample document entries per docket. Use c...
q*stringcourtstringcursorstringpage_sizeintegerparty_namestringfiled_afterstringfiled_beforestringcourtlistener_get_docketFetch full docket metadata and entry list for a single federal case by docket ID. Returns all available docket entries with document availability status. Documents with is_available=true have a RECAP-stored copy; others require a PACER account. Obtain docket IDs from courtlist...2 paramsFetch full docket metadata and entry list for a single federal case by docket ID. Returns all available docket entries with document availability status. Documents with is_available=true have a RECAP-stored copy; others require a PACER account. Obtain docket IDs from courtlist...
docket_id*integerentries_page_sizeintegercourtlistener_get_partiesFetch all parties and attorneys of record for a RECAP federal docket by docket ID. Returns each party's name, role (Plaintiff, Defendant, Petitioner, Respondent, etc.), and their attorneys with contact information. Requires two upstream calls per page (parties + attorney batch...3 paramsFetch all parties and attorneys of record for a RECAP federal docket by docket ID. Returns each party's name, role (Plaintiff, Defendant, Petitioner, Respondent, etc.), and their attorneys with contact information. Requires two upstream calls per page (parties + attorney batch...
pageintegerdocket_id*integerpage_sizeintegercourtlistener_search_judgesSearch judge/person records by name, appointing president, court, political affiliation, or demographic. Returns biographical data, current position, and appointment summary. Use courtlistener_get_judge for full appointment history and education records.6 paramsSearch judge/person records by name, appointing president, court, political affiliation, or demographic. Returns biographical data, current position, and appointment summary. Use courtlistener_get_judge for full appointment history and education records.
q*stringcourtstringcursorstringappointerstringpage_sizeintegerpolitical_affiliationstringd · r · i · l · g · ucourtlistener_get_judgeFetch full biographical profile for a single judge: appointment history across all courts, education, political affiliations, and ABA ratings. Obtain person IDs from courtlistener_search_judges results.1 paramsFetch full biographical profile for a single judge: appointment history across all courts, education, political affiliations, and ABA ratings. Obtain person IDs from courtlistener_search_judges results.
person_id*integercourtlistener_lookup_courtsList courts with optional filtering by jurisdiction type and scraper status. Primarily used to discover court IDs for use in search and filter parameters across all other courtlistener tools. Returns court IDs, full names, citation strings, and scraper status.3 paramsList courts with optional filtering by jurisdiction type and scraper status. Primarily used to discover court IDs for use in search and filter parameters across all other courtlistener tools. Returns court IDs, full names, citation strings, and scraper status.
in_usebooleanjurisdictionstringF · FD · FB · FBP · FS · Chas_opinion_scraperbooleancourtlistener_search_oral_argumentsSearch appellate oral argument audio recordings — the largest public collection of oral argument audio. Returns recording metadata with download URLs, panel judge IDs, and transcript snippets where available. Download URLs are direct MP3 links. Panel judge IDs can be passed to...6 paramsSearch appellate oral argument audio recordings — the largest public collection of oral argument audio. Returns recording metadata with download URLs, panel judge IDs, and transcript snippets where available. Download URLs are direct MP3 links. Panel judge IDs can be passed to...
q*stringcourtstringcursorstringpage_sizeintegerargued_afterstringargued_beforestringcourtlistener_get_oral_argumentFetch the full detail record for a single oral argument audio recording by its ID (the audio_id from courtlistener_search_oral_arguments). Returns the case name, panel judge IDs, duration, MP3 download URL, linked docket, and the speech-to-text transcript when transcription ha...1 paramsFetch the full detail record for a single oral argument audio recording by its ID (the audio_id from courtlistener_search_oral_arguments). Returns the case name, panel judge IDs, duration, MP3 download URL, linked docket, and the speech-to-text transcript when transcription ha...
id*integercourtlistener_search_financial_disclosuresSearch federal judicial financial disclosure filings — the annual reports judges file on investments, gifts, debts, outside positions, and income. Filter by judge (person ID from courtlistener_search_judges) and/or filing year. Returns per-filing metadata, category counts, ite...4 paramsSearch federal judicial financial disclosure filings — the annual reports judges file on investments, gifts, debts, outside positions, and income. Filter by judge (person ID from courtlistener_search_judges) and/or filing year. Returns per-filing metadata, category counts, ite...
yearintegercursorstringjudge_idintegerpage_sizeintegerSearch and retrieve US court opinions, federal dockets, judge records, citation networks, and oral arguments from CourtListener's 9M+ opinion corpus via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://courtlistener.caseyjhand.com/mcp
13 tools spanning the full CourtListener dataset — opinion search and retrieval, citation network traversal, federal docket lookup, party and attorney lookup, judge biography, judicial financial disclosures, court discovery, and oral argument search and detail:
| Tool | Description |
|---|---|
courtlistener_search_opinions | Full-text search across 9M+ written court opinions with field-level filtering, date ranges, status, and sort |
courtlistener_get_opinion | Fetch full text and metadata for an opinion cluster — returns all opinion variants (majority, concurrence, dissent) |
courtlistener_get_citations | Retrieve the citation network for an opinion: opinions cited by it (citing) or that cite it (cited_by) |
courtlistener_lookup_citation | Resolve a legal citation string (e.g., "410 U.S. 113") to a cluster ID and case metadata |
courtlistener_search_dockets | Search RECAP federal court dockets by party name, attorney, court, and date |
courtlistener_get_docket | Fetch docket metadata and entry list for a single federal case |
courtlistener_get_parties | Fetch all parties and attorneys of record for a RECAP federal docket by docket ID |
courtlistener_search_judges | Search judge records by name, appointing president, court, and political affiliation |
courtlistener_get_judge | Fetch full biographical profile, appointment history, and education for a single judge |
courtlistener_lookup_courts | List courts filtered by jurisdiction type and active-scraper status |
courtlistener_search_oral_arguments | Search appellate oral argument audio recordings by case name, court, and date argued |
courtlistener_get_oral_argument | Fetch full detail for a single oral argument — panel, duration, MP3 link, and speech-to-text transcript |
courtlistener_search_financial_disclosures | Search federal judicial financial disclosure filings by judge and year — category counts, itemized gifts, and source PDF |
courtlistener_search_opinionsSearch the 9M+ opinion corpus. Returns opinion cluster summaries with matched text excerpts.
caseName:, court_id:, judge:, docketNumber:, cites:(id), boolean AND / OR / NOTcluster_id (for courtlistener_get_opinion) and docket_id (for courtlistener_get_docket) for chainingcourtlistener_get_opinionFetch full text and metadata for an opinion cluster.
html_text and plain_text for each opinion variant; surfaces download_url when local text is absentcites[] (outbound citation IDs), cite_count, syllabus, posture, and docket linkcourtlistener_get_citationsRetrieve the citation network for an opinion cluster in either direction.
cited_by (default): opinions that cite this one — measures precedential influence and downstream adoptionciting: opinions this one cites — reveals the authority chain the court relied onsnippet showing the excerpt around the citation referencecourtlistener_lookup_citationResolve a formatted legal citation string to a cluster ID.
/citation-lookup/; falls back to search when unauthenticatedcourtlistener_search_docketsSearch RECAP federal court dockets.
party_name filter applies in addition to (AND with) the q query — more precise than embedding party names in the queryis_available statuscoverage_note in every response — RECAP is crowd-sourced from PACER; completeness varies by courtcourtlistener_get_docketFetch full docket metadata and entry list for a single federal case.
entries_page_size controls how many entries are returned (1–50); large cases have hundredsis_available: false require a PACER account or CourtListener RECAP filing — document retrieval is not exposedcourtlistener_get_partiesFetch all parties and attorneys of record for a RECAP federal docket.
page and page_size (max 10); keep page_size low to stay within the free-tier rate limitcourtlistener_search_dockets or courtlistener_get_docketcourtlistener_search_judgesSearch judge and person records across the federal and state bench.
d/r/i/l/g/u)person_id for chaining to courtlistener_get_judge, plus current position summarycourtlistener_lookup_courts can be passed directlycourtlistener_get_judgeFetch a judge's full biographical profile.
courtlistener_lookup_courtsList courts with optional jurisdiction and scraper filters.
F), district (FD), bankruptcy (FB), state supreme (SS), state appellate (SA), tribal, and morein_use: true (default) restricts to courts currently scraped by CourtListenerhas_opinion_scraper filter useful for planning opinion searches — courts without scrapers have sparse coverageid (the court_id string for use in all search and filter parameters), citation string (e.g., "9th Cir."), and jurisdiction labelcourtlistener_search_oral_argumentsSearch appellate oral argument audio recordings — the largest public collection of oral argument audio.
download_url (MP3), duration_seconds, panel_ids (chaining to courtlistener_get_judge), and transcript snippetcourtlistener_get_oral_argumentFetch the full detail record for a single oral argument by audio ID.
transcript when transcription has completed, plus panel_ids, duration_seconds, MP3 download_url, and the linked docket_idcourtlistener_search_oral_arguments resultscourtlistener_search_financial_disclosuresSearch federal judicial financial disclosure filings for ethics and recusal research.
judge_id (a person_id from courtlistener_search_judges) and/or filing yearBuilt on @cyanheads/mcp-ts-core:
none, jwt, oauth)in-memory, filesystem, Supabase, Cloudflare KV/R2/D1CourtListener-specific:
Agent-friendly output:
cluster_id, docket_id, and person_id fields are present wherever they enable a logical follow-up call, with field-level descriptions naming which tool to pass them tocoverage_note and oral argument transcript snippet availability explicitly signaled so agents can communicate limitations to users rather than silently omitting themA public instance is available at https://courtlistener.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"courtlistener-mcp-server": {
"type": "streamable-http",
"url": "https://courtlistener.caseyjhand.com/mcp"
}
}
}
Add the following to your MCP client configuration file. See CourtListener account settings to generate a free API token.
{
"mcpServers": {
"courtlistener-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/courtlistener-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"COURTLISTENER_API_TOKEN": "your-api-token"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"courtlistener-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/courtlistener-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"COURTLISTENER_API_TOKEN": "your-api-token"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"courtlistener-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"-e", "COURTLISTENER_API_TOKEN=your-api-token",
"ghcr.io/cyanheads/courtlistener-mcp-server:latest"
]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 COURTLISTENER_API_TOKEN=... bun run start:http
# Server listens at http://localhost:3010/mcp
git clone https://github.com/cyanheads/courtlistener-mcp-server.git
cd courtlistener-mcp-server
bun install
cp .env.example .env
# edit .env and set COURTLISTENER_API_TOKEN
All configuration is validated at startup via Zod schemas in src/config/server-config.ts. Key environment variables:
| Variable | Description | Default |
|---|---|---|
COURTLISTENER_API_TOKEN | Required. API token from your CourtListener account settings. Free tier: 5 req/min, 50/hr, 125/day. | — |
COURTLISTENER_BASE_URL | API base URL override. | https://www.courtlistener.com/api/rest/v4 |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_HTTP_ENDPOINT_PATH | HTTP endpoint path. | /mcp |
MCP_PUBLIC_URL | Public origin for TLS-terminating reverse-proxy deployments. | — |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
MCP_GC_PRESSURE_INTERVAL_MS | Opt-in Bun-only forced-GC pressure loop (ms). Try 60000 if RSS grows under sustained HTTP load. | 0 |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
See .env.example for the full list of optional overrides.
Build and run:
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against spec
docker build -t courtlistener-mcp-server .
docker run --rm -e COURTLISTENER_API_TOKEN=your-token -p 3010:3010 courtlistener-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/courtlistener-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
| Directory | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools and inits services. |
src/config | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools | Tool definitions (*.tool.ts). Ten tools across opinions, dockets, judges, courts, and oral arguments. |
src/services/courtlistener | CourtListener REST API client — auth, retry, rate-limit error classification. |
tests/ | Unit and integration tests mirroring src/. |
See CLAUDE.md for development guidelines and architectural rules. The short version:
try/catch in tool logicctx.log for request-scoped logging, ctx.state for tenant-scoped storagesrc/mcp-server/tools/definitions/index.tsIssues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
Apache-2.0 — see LICENSE for details.
COURTLISTENER_API_TOKEN*CourtListener API token from your account settings. Required for API access.
MCP_LOG_LEVELdefault: infoSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
MCP_HTTP_HOSTdefault: 127.0.0.1The hostname for the HTTP server.
MCP_HTTP_PORTdefault: 3010The port to run the HTTP server on.
MCP_HTTP_ENDPOINT_PATHdefault: /mcpThe endpoint path for the MCP server.
MCP_AUTH_MODEdefault: noneAuthentication mode to use: 'none', 'jwt', or 'oauth'.
com.mcparmory/google-search
io.github.pipeworx-io/brave-search
marcopesani/mcp-server-serper
brave/brave-search-mcp-server
com.mcparmory/google-search-console
acamolese/google-search-console-mcp