.codex-plugin — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited .codex-plugin (MCP Server) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<div align="center"> <h1>@cyanheads/courtlistener-mcp-server</h1> <p><b>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.</b> <div>13 Tools</div> </p> </div>
<div align="center">
</div>
<div align="center">
</div>
<div align="center">
Public Hosted Server: https://courtlistener.caseyjhand.com/mcp
</div>
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/mcpgit clone https://github.com/cyanheads/courtlistener-mcp-server.gitcd courtlistener-mcp-serverbun installcp .env.example .env
# edit .env and set COURTLISTENER_API_TOKENAll 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.
# One-time build
bun run rebuild
# Run the built server
bun run start:stdio
# or
bun run start:http bun run devcheck # Lint, format, typecheck, security
bun run test # Vitest test suite
bun run lint:mcp # Validate MCP definitions against specdocker build -t courtlistener-mcp-server .
docker run --rm -e COURTLISTENER_API_TOKEN=your-token -p 3010:3010 courtlistener-mcp-serverThe 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 testApache-2.0 — see LICENSE for details.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.