CCM
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Claude Code Marketplaces

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Skill index
  • MCP index
  • Marketplace index
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by mertbuilds.com

Independent project, not affiliated with Anthropic
cyanheads avatar

Courtlistener Mcp Server

cyanheads/courtlistener-mcp-server
213 toolsauthSTDIO, HTTPregistry active
Summary

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.

Install to Claude Code

verified
claude mcp add --transport http courtlistener https://courtlistener.caseyjhand.com/mcp

Run 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.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Lid closed, agents working
Lid closed, agents working
Keeps your Mac awake while Claude Code, Codex or Cursor works. Lets it sleep when they are done.
Try free for 7 days →
Block distraction from your iPhone for freeBlock distraction from your iPhone for free
Block distraction from your iPhone for free
Block distracting apps from your iPhone permanently without a 3rd party app. Free and open source.
Block now (100% free) →
Granola, the best AI meeting recorder
Granola, the best AI meeting recorder
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Open Steps
Open Steps
Free an open-source skills that make AI coding agents easier to understand, verify, and control.
Download for free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Agent, connect blockchain
Agent, connect blockchain
Connect your Claude agent to live crypto prices and trading routes via 1inch
Get the MCP →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Lid closed, agents working
Lid closed, agents working
Keeps your Mac awake while Claude Code, Codex or Cursor works. Lets it sleep when they are done.
Try free for 7 days →
Block distraction from your iPhone for freeBlock distraction from your iPhone for free
Block distraction from your iPhone for free
Block distracting apps from your iPhone permanently without a 3rd party app. Free and open source.
Block now (100% free) →
Granola, the best AI meeting recorder
Granola, the best AI meeting recorder
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Open Steps
Open Steps
Free an open-source skills that make AI coding agents easier to understand, verify, and control.
Download for free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Agent, connect blockchain
Agent, connect blockchain
Connect your Claude agent to live crypto prices and trading routes via 1inch
Get the MCP →

Tools

Verified live against the running server on Jun 10, 2026.

verified live13 tools
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 params

Full-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...

Parameters* required
courtstring
Filter to a specific court by court ID (e.g., "scotus", "ca9", "nyed"). Use courtlistener_lookup_courts to find court IDs.
cursorstring
Pagination cursor from a previous response's next_cursor field. Omit for the first page.
filed_afterstring
Earliest filing date (ISO 8601, e.g., "2020-01-01"). Narrows search to opinions filed on or after this date.
filed_beforestring
Latest filing date (ISO 8601). Narrows search to opinions filed before or on this date.
order_bystring
Result ordering. "score desc" (default) ranks by relevance. "citeCount desc" surfaces most-cited opinions first.one of score desc · dateFiled desc · dateFiled asc · citeCount descdefault: score desc
page_sizeinteger
Number of results to request (default 20). CourtListener search enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 results. Each search c...default: 20
q*string
Full-text query. Supports field syntax (caseName:"roe v wade", court_id:scotus, judge:"Alito") and boolean operators (AND, OR, NOT). Use plain English for semantic-style queries or legal citations.
statusstring
Opinion publication status. "Published": precedential. "Unpublished": not citable as precedent in most jurisdictions. "Errata": corrections. "Separate": separate opinion filed outside main cluster....one of Published · Unpublished · Errata · Separate · In-chambers · Relating-to
courtlistener_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 params

Fetch 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...

Parameters* required
cluster_id*integer
Opinion cluster ID — identifies a case decision and groups all opinion variants (majority, concurrence, dissent). Obtain from courtlistener_search_opinions, courtlistener_lookup_citation, or from d...
courtlistener_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 params

Retrieve 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...

Parameters* required
cluster_id*integer
Opinion cluster ID to retrieve citations for. Obtain from courtlistener_search_opinions or courtlistener_lookup_citation.
courtstring
Filter results to a specific court (e.g., "scotus", "ca9"). Applies to both directions.
cursorstring
Pagination cursor from a previous response's next_cursor field.
directionstring
"cited_by" (default): opinions that cite this one — measures precedential influence and downstream adoption. "citing": opinions this one cites — reveals the authority chain the court relied on.one of citing · cited_bydefault: cited_by
filed_afterstring
Limit to citations filed after this date (ISO 8601). For "cited_by", useful for "how has this precedent been applied recently?"
page_sizeinteger
Number of results (1–20). Each citation tool call costs one request against the rate limit — keep page_size low for multi-hop traversal.default: 10
courtlistener_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 params

Resolve 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...

Parameters* required
citation*string
Legal citation string to resolve (e.g., "410 U.S. 113", "347 U.S. 483", "93 S. Ct. 705"). Supports standard reporter formats.
courtlistener_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 params

Search 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...

Parameters* required
courtstring
Filter to a specific federal court ID (e.g., "dnd", "cacd", "deb" for Delaware Bankruptcy). Use courtlistener_lookup_courts to find court IDs.
cursorstring
Pagination cursor from a previous response's next_cursor field.
filed_afterstring
Earliest case filing date (ISO 8601).
filed_beforestring
Latest case filing date (ISO 8601).
page_sizeinteger
Number of results to request (default 20). CourtListener search enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 results.default: 20
party_namestring
Filter to dockets listing a specific party by name — applied in addition to (AND with) the q query. More precise than including party names in q when the party name is known.
q*string
Query terms matched against case name, docket number, party names, and attorney names. Example: "Apple Inc patent infringement".
courtlistener_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 params

Fetch 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...

Parameters* required
docket_id*integer
Docket ID from a search result's docket_id field or from an opinion cluster result.
entries_page_sizeinteger
Number of docket entries to return (1–50). Large cases can have hundreds of entries.default: 20
courtlistener_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 params

Fetch 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...

Parameters* required
docket_id*integer
Docket ID from a courtlistener_search_dockets or courtlistener_get_docket result's docket_id field.
pageinteger
Page number (1-indexed). Use with page_size to paginate large party lists.default: 1
page_sizeinteger
Number of parties per page (1–10). Each call makes two upstream requests (parties + attorney batch) — keep low to stay within the free-tier rate limit.default: 10
courtlistener_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 params

Search 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.

Parameters* required
appointerstring
Filter by appointing president's last name (e.g., "Obama", "Trump", "Biden"). Matches against the appointer field in position records.
courtstring
Filter to judges who have held a position at this court (e.g., "scotus", "ca9"). Use court_id strings from courtlistener_lookup_courts.
cursorstring
Pagination cursor from a previous response's next_cursor field.
page_sizeinteger
Number of results to request (default 20). CourtListener search enforces a minimum of 20 results per page regardless of the value passed.default: 20
political_affiliationstring
Filter by political affiliation: d=Democrat, r=Republican, i=Independent, l=Libertarian, g=Green Party, u=Unknown/unconfirmed. Based on party of the appointing president or election affiliation.one of d · r · i · l · g · u
q*string
Search query — judge name, court, city, or relevant keywords.
courtlistener_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 params

Fetch 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.

Parameters* required
person_id*integer
Judge person ID from a search result's person_id field. Identifies a specific judge across all courts they have served on.
courtlistener_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 params

List 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.

Parameters* required
has_opinion_scraperboolean
Filter to courts with active opinion scraping. Useful when planning search queries — courts without scrapers have sparse coverage.
in_useboolean
When true (default), only return courts currently scraped by CourtListener. Set to false to include historical or inactive courts.default: true
jurisdictionstring
Jurisdiction type. F=Federal Appellate (circuit courts, SCOTUS), FD=Federal District, FB=Federal Bankruptcy, FBP=Federal Bankruptcy Panel, FS=Federal Special (USITC, FISC, etc.), C=Circuit (histori...one of F · FD · FB · FBP · FS · C
courtlistener_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 params

Search 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...

Parameters* required
argued_afterstring
Earliest date the case was argued (ISO 8601) — filters by argument date, not publication date.
argued_beforestring
Latest date the case was argued (ISO 8601).
courtstring
Filter to a specific court (e.g., "scotus", "ca9").
cursorstring
Pagination cursor from a previous response's next_cursor field.
page_sizeinteger
Number of results to request (default 20). CourtListener search enforces a minimum of 20 results per page regardless of the value passed.default: 20
q*string
Query terms matched against case name and transcribed argument text (where available).
courtlistener_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 params

Fetch 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...

Parameters* required
id*integer
Audio recording ID — the audio_id field from a courtlistener_search_oral_arguments result.
courtlistener_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 params

Search 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...

Parameters* required
cursorstring
Pagination cursor from a previous response's next_cursor field.
judge_idinteger
Person ID of the judge whose disclosures to return — obtain from courtlistener_search_judges (the person_id field). Omit to browse across all filers.
page_sizeinteger
Number of filings to return (1–20).default: 20
yearinteger
Filing year to filter by (e.g., 2022). Filters the fetched filings — pair with judge_id for complete per-judge results. Omit to return all available years.

@cyanheads/courtlistener-mcp-server

Search 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.

14 Tools • 1 Resource • 1 Prompt

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

Public Hosted Server: https://courtlistener.caseyjhand.com/mcp


Overview

US case law and federal court records from CourtListener's 9M+ opinion corpus and its RECAP mirror of PACER. Search opinions and dockets, trace citation networks, resolve citations, look up judges and courts, and read oral argument transcripts and judicial financial disclosures. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.

Tools

ToolDescription
courtlistener_search_opinionsFull-text search across 9M+ court opinions with field syntax, court, date, and status filters
courtlistener_get_opinionFetch an opinion cluster's metadata and the full text of every variant (majority, concurrence, dissent)
courtlistener_get_citationsTrace a cluster's citation network: opinions it cites (citing) or that cite it (cited_by)
courtlistener_lookup_citationResolve every citation in a text (e.g. "410 U.S. 113") to cluster IDs and case metadata
courtlistener_search_docketsSearch RECAP federal dockets by case name, party, attorney, court, and filing date
courtlistener_get_docketFetch a federal docket's metadata and paged entry list with document availability
courtlistener_get_partiesFetch the parties and attorneys of record on a RECAP docket
courtlistener_search_judgesSearch judges by name, appointing president, court, and political affiliation
courtlistener_get_judgeFetch a judge's positions, education, political affiliations, and ABA ratings
courtlistener_lookup_courtsList courts by jurisdiction type, active/inactive status, and scraper coverage
courtlistener_search_oral_argumentsSearch appellate oral argument recordings by case name, transcript text, court, and argument date
courtlistener_get_oral_argumentFetch one oral argument's panel, duration, MP3 link, and speech-to-text transcript
courtlistener_search_financial_disclosuresSearch judicial financial disclosure filings by judge and year
courtlistener_get_financial_disclosureFetch one disclosure's line items with coded values decoded to dollar ranges

Resources

ResourceDescription
courtlistener://reference/courtsJurisdiction codes, common court IDs, search type codes, rate limits, and the maintenance window

The jurisdiction codes are also listed on the jurisdiction parameter of courtlistener_lookup_courts, for clients that don't surface resources.

Prompts

PromptDescription
courtlistener_research_topicGenerate a structured legal research plan for a topic or question

Capability reference

courtlistener_search_opinions tool

  • q is required and takes CourtListener field syntax (caseName:"roe v wade", court_id:scotus, judge:"Alito") and AND / OR / NOT; filter by court, filed_after / filed_before, and status, and sort with order_by (score desc default, dateFiled desc, dateFiled asc, citeCount desc); 20 results per page, continued with next_cursor
  • Each result carries cluster_id (for courtlistener_get_opinion and courtlistener_get_citations), docket_id, cite_count, a snippet, and opinions[] variants with opinion ID, type, author_id, and local_path; totalCount and effectiveQuery report the match

courtlistener_get_opinion tool

  • cluster_id is required; after an outline response, sections: ["opinion_<id>", ...] pulls specific variants, and a name the cluster doesn't have fails as unknown_section
  • Cluster metadata (case name, court_id, citations, cite_count, precedential_status, syllabus, posture, docket_id) plus each variant's html_text, plain_text, cites[], download_url, and type_label, the same label courtlistener_search_opinions reports
  • kind is full, or outline when the variants overflow the inline budget: the response then lists them as retrievable opinion_<id> sections and keeps the cluster metadata

courtlistener_get_citations tool

  • cluster_id is required; direction is cited_by (default, opinions that cite this one) or citing (opinions it cites); optional court and filed_after filters; up to 20 results per page, continued with cursor
  • Rows carry cluster_id, court_id, date_filed, cite_count, and snippet; for citing, totalCount counts the unfiltered cited-opinion list, and a filtered page can come back empty while next_cursor is still set

courtlistener_lookup_citation tool

  • citation takes one citation or a passage of up to 64,000 characters, and every citation in it resolves; max_court_lookups (default 4, max 20, 0 to skip) caps the docket requests spent on court names
  • One matches[] entry per citation, with status (200 one case, 300 several candidates, 400 unrecognized reporter, 404 no match, 429 past the per-request citation cap) and status_label; each of its clusters[] carries cluster_id, docket_id, court_id, and court_resolution (resolved, no_docket, lookup_failed, over_budget, only the last worth retrying with a larger budget)
  • Unresolved citations come back as entries, not errors; only text with no parseable citation fails, as not_found. CourtListener meters this endpoint per citation submitted, separately from the per-request limits

courtlistener_search_dockets tool

  • q is required and matches case name, docket number, party, and attorney names; party_name (ANDed with q), court, and filed_after / filed_before narrow it; 20 results per page, continued with next_cursor
  • Each docket carries docket_id, parties, attorneys, firms, suit_nature, assigned_to / referred_to, and up to 3 sample_documents with is_available and a RECAP filepath_local URL; every response adds a coverage_note on RECAP's partial PACER coverage

courtlistener_get_docket tool

  • docket_id is required; entries come 20 per page (CourtListener ignores entries_page_size), walked with entries_page
  • Returns docket metadata, total_entries, next_cursor (the next entries_page number), and entries[] whose documents[] carry is_available, page_count, and filepath_local; documents with is_available: false need PACER, and fetching them is not exposed

courtlistener_get_parties tool

  • docket_id is required; cursor takes the opaque next_cursor token, not a page number; page_size (max 10) is a request CourtListener may not honor
  • Each party carries name, its docket-scoped role, and attorneys[] with name, contact_raw, role_code / role (codes 5–9 mean no longer of record), and date_action; total_parties uses the upstream total when supplied, otherwise counts a single-page result or stays null

courtlistener_search_judges tool

  • q is required; filter by appointer (the president's last name), court, and political_affiliation (d, r, i, l, g, u); 20 results per page, continued with next_cursor
  • Results carry person_id (for courtlistener_get_judge), political_affiliation and aba_rating as labels rather than codes, and a current_position: the one with no termination date, or the latest-starting when several or none qualify

courtlistener_get_judge tool

  • person_id is required; positions are fetched up to a page bound, and truncated with positionsShown reports when a long record ran past it
  • Positions (judicial, plus non-judicial roles described by job_title and organization_name), education, political affiliations, ABA ratings, and fjc_id; coded fields keep the raw code beside a label (position_type_label, termination_reason_label, degree_label)
  • Dates carry the precision CourtListener recorded in dob_granularity, dod_granularity, date_start_granularity, and date_termination_granularity (year, month, or day)

courtlistener_lookup_courts tool

  • Filter by jurisdiction (one of 22 CourtListener codes such as F, FD, FB, S, SA; the full table is in courtlistener://reference/courts), status (active default, inactive, or any), and has_opinion_scraper; live records come 20 per page, walked with page
  • courts[] carry id (the court ID every other tool filters on), citation_string, jurisdiction, and scraper flags; all_matching_court_ids lists every match from a bundled snapshot at no request cost, and is empty when more than 1,000 match, so check all_matching_court_ids_complete

courtlistener_search_oral_arguments tool

  • q is required and matches case name and transcript text; filter by court and argued_after / argued_before; 20 results per page, continued with next_cursor
  • Results carry audio_id (for courtlistener_get_oral_argument), panel_ids (for courtlistener_get_judge), duration_seconds, snippet, and two MP3 links: download_url at the originating court and local_path, CourtListener's durable copy

courtlistener_get_oral_argument tool

  • id (an audio_id from a search) is required; sections: ["transcript"] pulls a transcript that an outline response withheld
  • Returns panel_ids, duration_seconds, download_url, docket_id, has_transcript, and transcript; kind is outline when the transcript overflows the inline budget. The argument date is not on this record; take it from the search result or the docket

courtlistener_search_financial_disclosures tool

  • Filter by judge_id (a person_id) and year; 20 filings per page, continued with cursor. year filters only the fetched page, because CourtListener has no server-side year filter, so keep paging when a page comes back empty with next_cursor set
  • Each filing carries disclosure_id, report_type, has_been_extracted, is_amended, pdf_url, per-category counts (investments, gifts, debts, positions, reimbursements, agreements, non-investment and spouse income), and itemized gifts

courtlistener_get_financial_disclosure tool

  • disclosure_id is required; categories selects from investments, debts, positions, reimbursements, non_investment_incomes, spouse_incomes, agreements, and gifts (omit for all)
  • Returns filing metadata, counts, and the requested line-item rows, with coded value and income columns decoded to dollar ranges (N → $250,001 - $500,000); kind is outline when the full itemization overflows, listing categories by size for a categories re-call

courtlistener://reference/courts resource

  • Markdown reference: the 22 jurisdiction codes (rendered from the set courtlistener_lookup_courts validates against), common court IDs, search type codes, the published free-tier rate limits, and the weekly maintenance window (Thursdays 21:00–23:59 PT)
  • Static content, cacheable publicly for 24 hours

courtlistener_research_topic prompt

  • Arguments: topic required; jurisdiction optional (a court ID such as scotus or ca9); depth optional, overview (default, 3–5 key cases) or deep (adds citation-network traversal and judge lookup)
  • Returns one user message laying out the research workflow and a findings template: key cases, precedent trajectory, research gaps

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

CourtListener-specific:

  • CourtListener REST API v4: search, opinions and clusters, dockets and entries, parties and attorneys, people and positions, courts, audio, financial disclosures, and citation lookup
  • One request queue for the whole process, paced to COURTLISTENER_RATE_LIMIT_PER_MINUTE and COURTLISTENER_RATE_LIMIT_PER_HOUR, so a burst waits instead of failing; a 429 pauses the queue for every waiting call, and a Retry-After is honored within a 45-second wait budget
  • Request cost per call: one for most tools; two for courtlistener_get_docket; two or more for courtlistener_get_parties and courtlistener_get_judge (one per extra page of a long roster or career); three for courtlistener_get_opinion and courtlistener_get_citations (plus one per extra page of opinion variants); and for courtlistener_lookup_citation, the lookup plus up to max_court_lookups docket requests
  • Input that can't succeed (an empty q, a malformed date, a citation over 64,000 characters, an unknown oral argument section) is rejected before a request is spent

Agent-friendly output:

  • Chaining IDs: cluster_id, docket_id, person_id, audio_id, and disclosure_id appear wherever they feed a follow-up call, with field descriptions naming the tool that takes each
  • Typed rate-limit errors: reason: "rate_limited" with retryAfter in seconds, whether CourtListener returned the 429 or the queue gave up before sending, in which case the message says no request was spent
  • Outlines instead of oversized payloads: courtlistener_get_opinion, courtlistener_get_oral_argument, and courtlistener_get_financial_disclosure return kind: "outline" with named sections to re-call for
  • Coverage caveats inline: RECAP coverage_note, court_resolution on citation lookups, truncated on position history, and notices when a page-local filter empties a page that has more pages behind it

Getting started

Public Hosted Instance

A 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"
    }
  }
}

Self-Hosted / Local

Add the following to your MCP client configuration file. Generate a free API token in your CourtListener account settings.

{
  "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

Prerequisites

  • Bun v1.4.0 or higher (or Node.js v24+).
  • A CourtListener API token from a free account at courtlistener.com. The published free-tier limits are 5 requests per minute, 50 per hour, and 125 per day; actual limits vary by token tier, and Free Law Project membership raises them.

Installation

  1. Clone the repository:
git clone https://github.com/cyanheads/courtlistener-mcp-server.git
  1. Navigate into the directory:
cd courtlistener-mcp-server
  1. Install dependencies:
bun install
  1. Configure environment:
cp .env.example .env
# edit .env and set COURTLISTENER_API_TOKEN

Configuration

VariableDescriptionDefault
COURTLISTENER_API_TOKENRequired. API token from your CourtListener account settings.—
COURTLISTENER_BASE_URLAPI base URL override.https://www.courtlistener.com/api/rest/v4
COURTLISTENER_RATE_LIMIT_PER_MINUTERequests the server starts per rolling minute. Past it, requests queue; one that can't start within about 45 s fails with the reset time. Raise it to match a higher token tier.5
COURTLISTENER_RATE_LIMIT_PER_HOURRequests the server starts per rolling hour.50
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTHTTP server port.3010
MCP_SESSION_MODEHTTP session mode: stateless, stateful, or auto. The server declares stateless; setting this overrides it.stateless
MCP_AUTH_MODEAuthentication: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.).info
LOGS_DIRDirectory for log files (Node.js only).<project-root>/logs
STORAGE_PROVIDER_TYPEStorage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1.in-memory
OTEL_ENABLEDEnable OpenTelemetry.false
OTEL_EXPORTER_OTLP_ENDPOINTBase endpoint for traces and metrics; appends /v1/traces and /v1/metrics. Without an endpoint, neither exports.—
OTEL_EXPORTER_OTLP_LOGS_ENDPOINTExplicit endpoint for redacted OTLP logs; the base endpoint does not enable log export.—
LOG_TOOL_FAILURE_PAYLOADSLog failed-call inputs and results with key-based redaction.false
LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTESSize cap for each logged failed-call payload.16384

See .env.example for the full list of optional overrides.

Running the server

Local development

  • 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

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.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point: registers tools, resources, and prompts, and inits the service.
src/configServer-specific environment variable parsing and validation with Zod.
src/mcp-server/toolsTool definitions (*.tool.ts). 14 tools across opinions, citations, dockets, parties, judges, courts, oral arguments, and financial disclosures.
src/mcp-server/resourcesResource definitions (*.resource.ts). Court reference resource.
src/mcp-server/promptsPrompt definitions (*.prompt.ts). Legal research prompt.
src/services/courtlistenerCourtListener API client (request pacing, retry, error classification), code tables, and the bundled court snapshot (bun run courts:snapshot regenerates it).
tests/Unit and integration tests mirroring src/.

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for request-scoped logging, ctx.state for tenant-scoped storage
  • Register new tools, resources, and prompts by importing them in src/index.ts and adding them to the createApp({ tools, resources, prompts }) arrays
  • Wrap CourtListener API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Contributing

Issues are welcome. Run checks and tests before submitting:

bun run devcheck
bun run test

License

Apache-2.0 — see LICENSE for details.

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Lid closed, agents working
Lid closed, agents working
Keeps your Mac awake while Claude Code, Codex or Cursor works. Lets it sleep when they are done.
Try free for 7 days →
Block distraction from your iPhone for freeBlock distraction from your iPhone for free
Block distraction from your iPhone for free
Block distracting apps from your iPhone permanently without a 3rd party app. Free and open source.
Block now (100% free) →
Granola, the best AI meeting recorder
Granola, the best AI meeting recorder
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Open Steps
Open Steps
Free an open-source skills that make AI coding agents easier to understand, verify, and control.
Download for free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Agent, connect blockchain
Agent, connect blockchain
Connect your Claude agent to live crypto prices and trading routes via 1inch
Get the MCP →

Configuration

COURTLISTENER_API_TOKEN*

CourtListener API token from your account settings. Required for API access.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Categories
Search & Web Crawling
Registryactive
Package@cyanheads/courtlistener-mcp-server
TransportSTDIO, HTTP
AuthRequired
Resources1
Prompts1
Tools verifiedJun 10, 2026
UpdatedJun 4, 2026
View on GitHub

More from cyanheads

  • Open Meteo Mcp Server2
  • Treasury Fiscaldata Mcp Server2
  • Usaspending Mcp Server2
  • Worldbank Mcp Server2
  • Bls Labor Mcp Server1
  • Cpsc Recalls Mcp Server1
  • Devops Status Mcp Server1
  • Earthquake Mcp Server1
  • Eia Energy Mcp Server1
  • Eurostat Mcp Server1
  • Fcc Broadband Mcp Server1
  • Gdelt Mcp Server1
  • Onebusaway Mcp Server1
  • Openfda Mcp Server1
  • Openfec Mcp Server1
  • Openfoodfacts Mcp Server1
  • Openlibrary Mcp Server1
  • Openstates Mcp Server1
  • Orcid Mcp Server1
  • Reliefweb Mcp Server1
  • Smithsonian Mcp Server1
  • Wikidata Mcp Server1
  • Wsdot Mcp Server1
  • Noaa Cdo Mcp Server2

Related Search & Web Crawling MCP Servers

View all →
cyanheads avatar
Libofcongress Mcp Server

cyanheads/libofcongress-mcp-server

Search LOC digital collections, Chronicling America newspapers (full OCR), and LC Subject Headings.
2
cyberpapiii avatar
Imessage Max

cyberpapiii/imessage-max

AI-optimized MCP server for iMessage on macOS. Read, search, and send messages.
2
damien829 avatar
AiPayGen — 65+ AI Tools as an MCP Server

damien829/aipaygen

65+ AI tools as MCP: research, write, code, scrape, translate, RAG, agent memory, workflows
2
davooxbv2 avatar
Clishop

davooxbv2/clishop

Order anything from your terminal — search, buy, track, and manage via MCP tools.
2
domdomegg avatar
Google Contacts

domdomegg/google-contacts-mcp

Allow AI systems to list, search, and manage contacts via Google Contacts.
2
drumst0ck avatar
Uploadkit

drumst0ck/uploadkit

UploadKit MCP — 40+ upload components, route scaffolds, BYOS setup, full docs search.
2