Skip to main content
Glama

Server Details

Search US court opinions, federal dockets, judges, citations, and oral arguments via CourtListener.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.9% over 69 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/courtlistener-mcp-server
GitHub Stars
4
Server Listing
@cyanheads/courtlistener-mcp-server

TDQS

A4.2/5.0

Scored across 14 tools

Disambiguation4/5

Each entity has a clear search/get pairing (dockets, judges, opinions, oral arguments, financial disclosures), so boundaries are mostly distinct. The only real friction is courtlistener_get_citations vs courtlistener_lookup_citation, which sound similar but serve different purposes (precedent network traversal vs. citation resolution); descriptions clarify this, though the names alone could mislead.

Naming Consistency5/5

All 14 tools follow a strict courtlistener_<verb>_<noun> pattern using get_, search_, and lookup_ prefixes consistently. The convention is predictable and immediately readable, with no mixing of styles or casing.

Tool Count5/5

14 tools is well within the ideal 3-15 range and each maps to a distinct resource or operation. No tool feels redundant or bolted on; the count matches the breadth of the legal research domain cleanly.

Completeness4/5

Coverage is strong: search and fetch pairs for judges, dockets, parties, opinions, oral arguments, financial disclosures, plus court discovery and citation resolution. The notable gap is retrieving the actual RECAP document text — the docket tool reports is_available copies but no tool fetches them, forcing a dead end for full-text documents.

Available Tools

14 tools
courtlistener_get_citationsGet Citation NetworkA
Read-only
Inspect

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 precedent chains. Note: the free tier supports shallow traversal — following 1–2 hops of a single case is practical; deep multi-hop analysis burns through the daily budget quickly.

NameRequiredDescriptionDefault
courtNoFilter results to a specific court (e.g., "scotus", "ca9"). Applies to both directions.
cursorNoPagination cursor from next_cursor. For citing, a nonnegative safe decimal integer offset; for cited_by, an opaque upstream token.
directionNo"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.cited_by
page_sizeNoPositive requested size (default 20), bounded to 20. cited_by has an upstream minimum of 20; citing slices at most 20 cited IDs by the bounded size before filtering. Full upstream pages are preserved. Final or filtered pages can be smaller or empty; retain next_cursor to continue. page_sizing distinguishes requested, bounded and actual sizes. A normal call costs three requests plus extra variant pages.
cluster_idYesOpinion cluster ID to retrieve citations for. Obtain from courtlistener_search_opinions or courtlistener_lookup_citation.
filed_afterNoLimit to citations filed after this date (ISO 8601). For "cited_by", useful for "how has this precedent been applied recently?"

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoContext when no citations are returned — either that this page had no match under the filters and more pages remain, or a recovery hint echoing direction and filters.
resultsNoRelated opinions in the citation network.
directionNoDirection of the citation relationship returned.
totalCountNoExact total for the fetched direction when source variants are complete; absent when total_is_partial is true. For cited_by this counts matching clusters after filters; for citing it counts distinct cited opinions before any filter, which can exceed the cluster rows.
next_cursorNoPagination cursor for the next page; null when no more results.
page_sizingNoRequested, bounded, and actual page sizes.
observed_totalNoCitation total observed from the fetched source variants; a lower bound when total_is_partial is true.
source_case_nameNoCase name for the source cluster.
total_is_partialNoTrue when citation results and totals are based on an incomplete source-variant set.
source_cluster_idNoThe cluster ID this citation network is for.
source_variants_completionNoCompletion of the source opinion-variant walk.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true, idempotentHint=false). The description adds real behavioral context the annotations don't: the free-tier budget constraint and the practical limit of 1-2 hops before cost escalates.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with purpose and direction semantics, with the budget caveat placed last where it belongs. Slightly verbose in re-explaining the same two directions the schema already documents, which costs a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the free-tier constraint is a genuinely useful addition. It stops short of 5 mainly because pagination and the multi-request cost model are left entirely to the schema rather than being reinforced at the description level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description restates the semantic intent of the 'direction' enum (influence vs authority chain) but adds little beyond what the schema's own enum description already says, and says nothing extra about court, cursor, or page_size.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retrieve the citation network for an opinion cluster') and immediately disambiguates the two traversal directions, so an agent can distinguish it from siblings like courtlistener_lookup_citation without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Declares itself 'the primary tool for tracing legal precedent chains' and gives a use case per direction (recent application via filed_after, authority chain via citing). It never explicitly names an alternative tool or a when-not-to-use condition, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_get_docketGet DocketA
Read-onlyIdempotent
Inspect

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 courtlistener_search_dockets or from opinion results.

NameRequiredDescriptionDefault
docket_idYesDocket ID from a search result's docket_id field or from an opinion cluster result.
entries_pageNoPage of docket entries to fetch (1-indexed). Docket entries are page-paginated at 20 per page; pass the next_cursor from a previous response here to page through large cases.
entries_page_sizeNoRequested docket entries per page. NOTE: CourtListener ignores this value — /docket-entries/ always returns a fixed 20-entry page regardless of what is passed. Use entries_page to reach entries beyond the first 20 (large cases can have hundreds).

Output Schema

NameRequiredDescription
causeNoLegal cause of action.
courtNoCourt display name for major federal courts; the court identifier otherwise.
errorNoPresent when the call failed. Absent on success.
entriesNoDocket entries for this page (fixed at 20 per page; entries_page_size is not honored by upstream).
court_idNoCourt identifier — the stable value for filtering.
case_nameNoShort case name.
docket_idNoDocket ID.
date_filedNoDate the case was filed.
assigned_toNoAssigned judge name; null if not recorded.
jury_demandNoJury demand status.
next_cursorNoNext page number to pass as the `entries_page` argument (docket entries are page-paginated); null when this is the last page.
page_sizingNoRequested, bounded, and actual page sizes.
referred_toNoReferred judge name; null if not recorded.
entries_pageNoCurrent entries page number (1-indexed).
docket_numberNoDocket number.
pacer_case_idNoPACER case ID; null if not in RECAP.
total_entriesNoTotal number of docket entries available; null when upstream supplies no numeric total. May exceed the returned entries list.
case_name_fullNoFull case name.
date_terminatedNoDate the case was terminated; null if active.
jurisdiction_typeNoJurisdiction type.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/idempotentHint annotations, it discloses meaningful behavior: entries come with document availability status, is_available=true means a RECAP-stored copy exists, and others require a PACER account. This PACER/RECAP distinction is exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tightly packed sentences, front-loaded with the purpose, then availability semantics, then input sourcing. Every sentence carries distinct information with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no prose explanation; the description covers purpose, the RECAP/PACER availability caveat, and how to obtain the ID. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema itself is unusually thorough (including the note that entries_page_size is ignored and entries_page drives pagination). The description adds nothing parameter-specific beyond reiterating docket ID sourcing, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) and resource (full docket metadata and entry list) with clear scope (a single federal case by docket ID). This clearly distinguishes it from the sibling courtlistener_search_dockets, which finds cases rather than returning one case's contents.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent where to get the required input: 'Obtain docket IDs from courtlistener_search_dockets or from opinion results,' which establishes the search-then-fetch workflow. It does not name a when-not or a conflicting alternative, so it stops short of the top tier.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_get_financial_disclosureGet Financial DisclosureA
Read-onlyIdempotent
Inspect

Fetch a judicial financial disclosure by disclosure_id from courtlistener_search_financial_disclosures. Returns metadata, counts and typed line items with coded values decoded to dollar ranges. Select categories or omit for all. Oversized selections return outline then page responses; continue retrieval.next_cursor as cursor with the unchanged ID/categories selection until null. Large individual row fields remain recoverable through text_chunks.

NameRequiredDescriptionDefault
cursorNoRetrieval next_cursor from the previous response. Repeat the original ID and sections/categories selection unchanged; omit to start.
categoriesNoLine-item categories to select. Omit for all. Oversized selections page; keep this selection unchanged while following cursor.
disclosure_idYesFinancial disclosure ID — the disclosure_id field from a courtlistener_search_financial_disclosures result.

Output Schema

NameRequiredDescription
kindNo'full' carries a small selected record; 'outline' pages the section catalog; 'page' carries typed rows and field-path text chunks. Filing identity and counts remain present.
yearNoFiling year.
debtsNoDebts and liabilities.
errorNoPresent when the call failed. Absent on success.
giftsNoReported gifts.
countsNoCount of line items in each disclosure category.
pdf_urlNoURL to the source disclosure PDF; null if unavailable.
sectionsNoCategory catalog in declared order, with paged metadata fields. Follow retrieval.next_cursor to finish the catalog and retrieve data.
person_idNoPerson ID of the filer — pass to courtlistener_get_judge; null if absent.
positionsNoOutside positions.
retrievalNoCaller retrieval completion, separate from upstream source completion.
agreementsNoContinuing agreements.
is_amendedNoTrue if this filing is an amendment.
page_countNoPage count of the source filing; null if not recorded.
investmentsNoInvestment holdings.
report_typeNoReport type (Nomination, Initial, Annual, Final, or Unknown).
disclosure_idNoFinancial disclosure ID.
reimbursementsNoReimbursements.
spouse_incomesNoSpouse income sources.
retrieval_noticeNoHow to continue bounded retrieval using the unchanged ID and selection.
has_been_extractedNoTrue if line items were parsed from the PDF; category arrays are empty when false.
non_investment_incomesNoNon-investment income sources.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, yet the description adds substantial behavior: oversized selections return an outline then page responses, next_cursor must be followed with the unchanged ID/categories selection until null, and large row fields are recoverable via text_chunks. This is genuine operational context beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and then packs pagination, decoding, and recovery details into dense but relevant sentences. Every sentence earns its place, though the middle section is somewhat compressed and technical.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, and the description still covers decoding of coded values, the paging protocol, cursor continuation, and large-field recovery. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: categories can be selected or omitted for all, and cursor must be continued with the unchanged selection. That constraint on cursor usage is not derivable from the schema alone, pushing it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) plus resource (judicial financial disclosure) and pins the identifier source (disclosure_id from courtlistener_search_financial_disclosures). This clearly distinguishes it from the sibling search tool and the other get_* tools that operate on different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names the sibling search_financial_disclosures as the origin of the ID, implying the fetch-after-search workflow, and describes the pagination follow-up path. It does not explicitly state when not to use it, so it stops short of a full when/when-not/alternatives statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_get_judgeGet Judge ProfileA
Read-onlyIdempotent
Inspect

Fetch full biographical profile for a single judge: positions on record — judicial appointments across all courts plus non-judicial roles — education, political affiliations, and ABA ratings. The position list is paginated upstream and walked under a page bound; the response reports whether it was truncated. Obtain person IDs from courtlistener_search_judges results.

NameRequiredDescriptionDefault
person_idYesJudge person ID from a search result's person_id field. Identifies a specific judge across all courts they have served on.

Output Schema

NameRequiredDescription
dobNoDate of birth as CourtListener stores it, always full ISO 8601 — but the month and day are placeholders unless dob_granularity is "day". Read dob_granularity before presenting this as an exact date. Null if not recorded.
dodNoDate of death as CourtListener stores it, always full ISO 8601 — precision qualified by dod_granularity, as with dob. Null if living or not recorded.
nameNoFull name.
errorNoPresent when the call failed. Absent on success.
fjc_idNoFederal Judicial Center ID for cross-referencing with FJC data; null if not available.
genderNoGender.
noticeNoPresent only when positions[] was truncated: what was withheld.
dob_cityNoCity of birth; null if not recorded.
dob_stateNoState of birth; null if not recorded.
educationNoEducational history.
person_idNoPerson ID.
positionsNoPositions on record, across all courts — judicial appointments plus non-judicial roles (private practice, prosecutor, professor), which carry no court and describe themselves in job_title. CourtListener paginates this list and the walk is bounded, so read the truncated flag before treating it as a complete career.
truncatedNoTrue when the bounded /positions/ page walk stopped with pages outstanding — positions[] is then a prefix of the person's record, not the whole of it. False when the walk reached the end.
aba_ratingsNoABA qualification ratings, expanded to readable labels (e.g., "Well Qualified").
positionsShownNoNumber of position records returned.
dob_granularityNoPrecision actually recorded for dob: "year", "month", or "day". Null when CourtListener recorded no precision. An unrecognized upstream value passes through unchanged.
dod_granularityNoPrecision actually recorded for dod: "year", "month", or "day". Null when CourtListener recorded no precision.
political_affiliationsNoPolitical affiliation history.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly and idempotent. The description adds genuinely useful behavior: the position list is paginated upstream, walked under a page bound, and the response reports whether it was truncated. That is real context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the content listing, followed by the pagination caveat and the ID provenance. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation; the description still flags truncation reporting, which is the one behavioral nuance an agent needs. Nothing material is missing for a single-parameter read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single person_id is fully documented in the schema, including its provenance. The description's pointer to search results mostly repeats the schema, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch) and resource (full biographical profile for a single judge), then enumerates the contents: positions, education, political affiliations, ABA ratings. An agent can distinguish this from courtlistener_search_judges immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to courtlistener_search_judges as the source of person IDs, which is the key prerequisite. It does not state any when-not condition or alternative retrieval paths, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_get_opinionGet Court OpinionA
Read-onlyIdempotent
Inspect

Fetch text and metadata for an opinion cluster by cluster ID. Returns majority, concurrence and dissent variants with raw HTML and readable plain text, variants_completion for source coverage, and docket_enrichment. Oversized selections return outline then page responses; continue retrieval.next_cursor as cursor with the unchanged ID/sections selection until null. Obtain cluster IDs from courtlistener_search_opinions, courtlistener_lookup_citation, or docket results.

NameRequiredDescriptionDefault
cursorNoRetrieval next_cursor from the previous response. Repeat the original ID and sections/categories selection unchanged; omit to start.
sectionsNoOpinion variant identifiers to select (e.g. ["opinion_12345"]). Omit for all fetched variants. Oversized selections page; keep this selection unchanged while following cursor.
cluster_idYesOpinion cluster ID — identifies a case decision and groups all opinion variants (majority, concurrence, dissent). Obtain from courtlistener_search_opinions, courtlistener_lookup_citation, or from docket results that link to opinions.

Output Schema

NameRequiredDescription
kindNo'full' carries a small selected record; 'outline' pages the section catalog; 'page' carries typed rows and field-path text chunks. Bounded identity remains present throughout retrieval.
courtNoCourt display name.
errorNoPresent when the call failed. Absent on success.
judgesNoJudge names.
postureNoProcedural posture (may be empty).
court_idNoCourt identifier.
opinionsNoFetched variants; variants_completion describes source coverage. Pages can contain partial typed variants; omitted text is recoverable through retrieval.text_chunks at original field paths.
sectionsNoSection catalog in source order, including paged metadata. Only opinion_<id> names select variants; follow retrieval.next_cursor to finish the catalog and retrieve data.
syllabusNoSyllabus text (may be empty).
case_nameNoShort case name.
citationsNoAll known citation strings for this case.
docket_idNoAssociated docket ID.
retrievalNoCaller retrieval completion, separate from upstream source completion.
cite_countNoTotal number of citations from other opinions.
cluster_idNoOpinion cluster ID.
date_filedNoDate the opinion was filed.
docket_numberNoDocket number.
case_name_fullNoFull case name with parties.
retrieval_noticeNoHow to continue bounded retrieval using the unchanged ID and selection.
docket_enrichmentNoLinked-docket enrichment outcome, independent of opinion text availability.
precedential_statusNoPublication/precedential status.
variants_completionNoSource-walk completion. An oversized upstream next_cursor is omitted on partial responses and recovered at /variants_completion/next_cursor through retrieval.text_chunks.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint and idempotentHint, but the description adds substantial behavioral context: the variant structure, raw HTML plus plain text, variants_completion source coverage, docket_enrichment, and the oversized-selection pagination protocol (outline then pages, repeat unchanged selection until cursor is null). This is exactly the extra depth the annotations do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the core action, then returns, then pagination, then ID sourcing. Dense but each sentence carries distinct information; minor overlap between the description and schema text on cursor/sections keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, yet the description still sketches them, and it fully covers the pagination continuation behavior and ID provenance. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it maps retrieval.next_cursor to the cursor param and stresses the invariant that ID/sections must stay unchanged while following the cursor. That pagination contract is not obvious from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (fetch) and resource (text and metadata for an opinion cluster) keyed by cluster ID, and specifies the returned variant types (majority, concurrence, dissent). An agent can distinguish this read of a single opinion cluster from search or lookup siblings without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to courtlistener_search_opinions, courtlistener_lookup_citation, or docket results for obtaining cluster IDs, and explains the cursor-continuation workflow. It stops short of naming a when-not-to-use alternative among the get_* siblings, so it is clear context rather than full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_get_oral_argumentGet Oral ArgumentA
Read-onlyIdempotent
Inspect

Fetch an oral argument recording by audio_id from courtlistener_search_oral_arguments. Returns case metadata, panel IDs, duration, MP3 URL, docket and available transcript. Oversized text or metadata returns outline then page responses; continue retrieval.next_cursor as cursor with the unchanged ID/sections selection until null. The argument date comes from search or the linked docket.

NameRequiredDescriptionDefault
idYesAudio recording ID — the audio_id field from a courtlistener_search_oral_arguments result.
cursorNoRetrieval next_cursor from the previous response. Repeat the original ID and sections/categories selection unchanged; omit to start.
sectionsNoSelected record fields. Metadata is always selected; a nonempty selection omitting transcript excludes it. Omit for the whole record. Oversized selections page; keep this selection unchanged while following cursor.

Output Schema

NameRequiredDescription
kindNo'full' carries a small selected record; 'outline' pages the section catalog; 'page' carries fields and text chunks. Bounded identity remains present throughout retrieval.
errorNoPresent when the call failed. Absent on success.
judgesNoFree-text judge names; often empty on this endpoint.
sectionsNoSection catalog: transcript and paged metadata fields. Follow retrieval.next_cursor to finish the catalog and retrieve data.
case_nameNoCase name.
docket_idNoAssociated docket ID; 0 if not linked.
panel_idsNoPerson IDs of panel judges — pass to courtlistener_get_judge.
retrievalNoCaller retrieval completion, separate from upstream source completion.
transcriptNoSpeech-to-text transcript; empty if transcription has not completed. Oversized text is recovered through retrieval.text_chunks at /transcript.
download_urlNoDirect MP3 download URL; null if not available.
case_name_fullNoFull case name with parties.
has_transcriptNoTrue if a speech-to-text transcript is available.
duration_secondsNoRecording duration in seconds.
oral_argument_idNoAudio recording ID.
retrieval_noticeNoHow to continue bounded retrieval using the unchanged ID and selection.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint and idempotentHint, so the description's disclosure that oversized text/metadata responses are split into outline-then-page results, that paging continues until next_cursor is null, and that the argument date must come from search or the linked docket is genuinely additive. It does not cover auth or rate-limit behavior, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the ID source, then the return contents, then the paging mechanics in a compact four sentences. The paging sentence is dense and slightly hard to parse on first read, but nothing is wasted or redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description need not enumerate return values, yet the outlined list (metadata, panel IDs, duration, MP3 URL, docket, transcript) plus the cursor-continuation rule gives an agent everything needed to call and resume correctly. Only permissions/error behavior is unaddressed, which is low-stakes for an annotated read-only tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the schema already documents id, cursor, and sections thoroughly, including the rule that metadata is always selected. The description largely restates the cursor/sections paging contract the schema already carries, adding little parameter-level meaning beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Fetch an oral argument recording") and names the exact source of the identifier, tying it to courtlistener_search_oral_arguments rather than any sibling like get_docket or get_opinion. An agent can immediately tell this is the retrieve-one-by-ID counterpart to the oral-argument search tool. The only nit is that the description calls the key "audio_id" while the schema parameter is "id", but the schema's own description reconciles this.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear entry condition — you call this after a search_oral_arguments result supplies the ID — and explains the pagination follow-up (repeat next_cursor with the unchanged ID/sections until null). There is no explicit when-not or alternative-selection statement, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_get_partiesGet PartiesA
Read-onlyIdempotent
Inspect

Fetch a page of parties and their 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, scoped to this docket. Costs one party request plus up to five attorney roster requests. A later roster page blocked by the local request budget returns fetched detail with capped resolution, unresolved IDs, and the remaining roster cursor. Obtain docket IDs from courtlistener_search_dockets or courtlistener_get_docket.

NameRequiredDescriptionDefault
cursorNoPagination cursor from a previous response's next_cursor field. Omit for the first page. This is an opaque token, not a page number — CourtListener cursor-paginates this endpoint, so a numeric value selects nothing and re-serves the first page.
docket_idYesDocket ID from a courtlistener_search_dockets or courtlistener_get_docket result's docket_id field.
page_sizeNoPositive requested party page size (default 10), bounded to 10 before retrieval. CourtListener uses fixed 20-row pages and ignores this request; final pages can be smaller. page_sizing reports requested, bounded and actual sizes.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
partiesNoParties on this page.
docket_idNoDocket ID these parties belong to.
totalCountNoTotal parties on this docket across all pages — this endpoint reports its count as a URL rather than a number, so the total is only derivable when the first page is also the last, and is absent for any list spanning more than one page.
next_cursorNoOpaque pagination cursor for the next page — pass it back as the `cursor` argument; null when this is the last page.
page_sizingNoRequested, bounded, and actual page sizes.
total_partiesNoTotal parties on this docket across all pages; null when no total is derivable — CourtListener serves the count as a URL rather than a number here, so it is only known when the first page is also the last.
attorney_resolutionNoAttorney lookup completeness; no additional automatic requests are made.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnlyHint/idempotentHint annotations by disclosing the cost model (one party request plus up to five attorney roster requests), the local request-budget blocking behavior, and the degraded response shape (capped resolution, unresolved IDs, remaining roster cursor). This is exactly the operational context an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then returns, cost, edge case, and prerequisite in a logical order. Every sentence carries information, though the description is somewhat dense and the return-value sentence overlaps with the available output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema and safety annotations already exist, the description still supplies the cost/budget caveats and the ID-sourcing prerequisite, leaving nothing an agent needs to invoke it correctly. The request-budget degradation behavior is particularly valuable and not recoverable from structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents docket_id, cursor, and page_size thoroughly. The description's mention of a 'roster cursor' adds a little relational context, but it does not clarify parameter behavior beyond what the schema provides, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Fetch a page of parties and their attorneys of record'), names the scope ('for a RECAP federal docket by docket ID'), and enumerates the returned fields. No sibling tool fetches parties, so it is trivially distinguishable from the rest of the family.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to obtain the required docket_id from courtlistener_search_dockets or courtlistener_get_docket, which is the key prerequisite. It lacks an explicit when-not or alternative-selection clause, but no sibling performs this function, so the omission is minor.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_lookup_citationLookup Legal CitationA
Read-onlyIdempotent
Inspect

Resolve legal citations (e.g., "410 U.S. 113", "93 S. Ct. 705") to opinion cluster IDs and case metadata. Enables workflows that start from a known citation rather than a search query. CourtListener extracts every citation it finds in the submitted text, so passing a passage returns one entry per citation, each with its own resolution status — an unresolved or ambiguous citation is reported in the results, not raised as an error. Supports standard US reporter formats. Costs one request against CourtListener's per-citation quota, plus one ordinary request per distinct docket whose court is resolved — max_court_lookups bounds that second half (default 4, set 0 to skip court resolution entirely). CourtListener meters this endpoint by citations submitted rather than by call, so a long passage spends proportionally more of that quota. Requires authentication — uses the CourtListener /citation-lookup/ endpoint.

NameRequiredDescriptionDefault
citationYesText to extract citations from — normally a single citation (e.g., "410 U.S. 113", "347 U.S. 483", "93 S. Ct. 705"), but any passage works and every citation in it is resolved. Supports standard reporter formats. Up to 64000 characters, which is CourtListener's own ceiling; a longer passage is rejected here rather than spending a request to be refused upstream.
max_court_lookupsNoHow many distinct dockets this call may spend a request on to resolve cluster courts. The lookup itself is metered separately by CourtListener (per citation submitted), so this budget is drawn entirely from the ordinary per-request allowance — published free tier 5/min, 50/hour, 125/day, varying by token tier. 0 skips court resolution and costs nothing beyond the lookup; 20 is the ceiling. Clusters past the budget come back with court null and court_resolution "over_budget".

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoCaveats on this result: a recovery hint when no citation in the input resolved to a case, and counts of the clusters whose court went unresolved — split by whether the per-call docket budget ran out or an attempted lookup returned nothing, since only the first is worth retrying with a larger budget. Absent when none applies.
matchesNoOne entry per citation CourtListener extracted from the input, in the order they appear.
queriedCitationNoThe citation string that was looked up.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent annotations: discloses per-citation quota metering, the additional per-docket request cost, the 64000-char ceiling, the authentication requirement, and the key behavioral trait that unresolved/ambiguous citations are returned in results rather than raised as errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and input examples, then layers cost/auth/limit details in a single dense block. Every sentence carries load, though the quota discussion is somewhat thick and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value documentation is unnecessary, and the description covers the remaining gaps an agent needs: auth, meter model, budget semantics, size limit, and partial-failure handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: it clarifies that the quota is charged per citation submitted rather than per call (so a long passage costs more) and that max_court_lookups draws on the separate per-request allowance with clusters past budget returning court_resolution "over_budget".

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Resolve legal citations ... to opinion cluster IDs and case metadata") and gives concrete input examples. It also distinguishes itself from the search siblings by naming the workflow it serves: "start from a known citation rather than a search query."

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly frames the selection context (citation-first workflows vs. query-first search) and explains the max_court_lookups budget trade-off, including setting 0 to skip court resolution. It stops short of naming a specific sibling alternative the way the calibration's top example does.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_lookup_courtsLookup CourtsA
Read-only
Inspect

List courts with optional filtering by jurisdiction type, active/inactive status, and scraper coverage. Primarily used to discover court IDs for use in search and filter parameters across all other courtlistener tools. Defaults to the active bench — the courts CourtListener still scrapes; pass status:'inactive' for historical courts or status:'any' for every court. A bundled snapshot returns the complete list of matching court IDs without paging whenever the filtered set fits the response budget, which covers the default bench and every jurisdiction filter. Full court records — names, citation strings, scraper status — come live from CourtListener at a fixed 20 rows per page, so pull those only when a court ID alone is not enough.

NameRequiredDescriptionDefault
pageNoPage number (1-indexed). CourtListener serves /courts/ at a fixed 20 rows per page and ignores any requested page size, so the number of pages is the enrichment totalCount divided by 20 — there is no way to pull a larger page. Pass the next_cursor from a previous response here to walk them one call at a time.
statusNoWhich bench to return. 'active' (default) returns only courts CourtListener currently scrapes; 'inactive' returns only the historical and defunct courts it no longer scrapes; 'any' returns both. The two filtered sets are disjoint, so 'any' is the only value that reaches the whole list — but reaching all of it means paging, one call per 20 courts, and the inactive bench is several times larger than the active one. Prefer the narrowest value that answers the question, and narrow with jurisdiction rather than paging the full list.active
jurisdictionNoJurisdiction type — CourtListener's own court classification, one code per court: F=Federal Appellate, FD=Federal District, FB=Federal Bankruptcy, FBP=Federal Bankruptcy Panel, FS=Federal Special, S=State Supreme, SA=State Appellate, ST=State Trial, SS=State Special, SAG=State Attorney General, TRS=Tribal Supreme, TRA=Tribal Appellate, TRT=Tribal Trial, TRX=Tribal Special, TS=Territory Supreme, TA=Territory Appellate, TT=Territory Trial, TSP=Territory Special, MA=Military Appellate, MT=Military Trial, C=Committee, I=International. Omit to list all. SCOTUS and the numbered circuits are F; USITC and FISC are FS. Upstream's Testing code is not offered here: /courts/ excludes testing courts from every response, so a filter on it can only ever return nothing. Accepted but matching no court as of the 2026-07-30 snapshot: TSP, MT. Courts whose stored jurisdiction is not one of these codes (njcirctsussex, ohctapp1) are unreachable through this filter at any value — the value they store is not one the filter accepts. Pass those ids straight to the tool that needs them, or list with no jurisdiction filter.
has_opinion_scraperNoFilter to courts with active opinion scraping. Useful when planning search queries — courts without scrapers have sparse coverage.

Output Schema

NameRequiredDescription
pageNoCurrent page number (1-indexed).
errorNoPresent when the call failed. Absent on success.
courtsNoMatching courts on this page.
noticeNoRecovery hint when no courts match the applied filters.
totalCountNoTotal courts returned.
next_cursorNoNext page number to pass as the `page` argument (this list is page-paginated at a fixed 20 rows/page); null when this is the last page — a non-null value means the courts shown are a partial view of the filtered set.
all_matching_court_idsNoEvery court id matching the same filters, from a snapshot of /courts/ bundled with this server (taken 2026-07-30) — the complete set, not just this page, and free of any request. Paging `courts` is only needed for the fields a court id alone does not carry (full_name, citation_string, scraper flags). Empty when more than 1000 courts match, since a prefix of the set would be indistinguishable from the whole of it — check all_matching_court_ids_complete before reading emptiness as "no courts match". A court added or retired upstream since the snapshot date appears in `courts` but may be missing here.
all_matching_court_ids_completeNoTrue when all_matching_court_ids holds every matching court id. False when more than 1000 courts match: the list is withheld whole rather than truncated, and the notice gives the count and how to narrow.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=true, openWorldHint=true), but the description adds genuinely non-obvious behavior: a bundled snapshot serves the complete matching ID list without paging when the set fits the response budget, whereas full records come live from CourtListener at a fixed 20 rows per page. That paging/response-budget distinction is not derivable from the annotations and materially affects how an agent plans calls. Minor overlap with the schema's page description keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the ID-discovery rationale, then the status defaults, then the paging/snapshot economics — a sensible ordering with no filler sentences. It is slightly long and repeats the '20 rows per page' constraint already stated in the page parameter description, which costs it a point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained. The description covers the remaining complexity an agent needs: default scope, disjoint status benches, filter narrowing, and the snapshot-vs-live paging tradeoff. Nothing required to call this four-parameter, zero-required-parameter tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents status semantics and the full jurisdiction code map in more detail than the description. The description largely restates the defaults ('defaults to the active bench', status:'inactive'/'any') rather than adding new parameter meaning. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List courts') and immediately scopes it with the available filters (jurisdiction, status, scraper coverage). It also explicitly positions itself against the rest of the toolset: 'Primarily used to discover court IDs for use in search and filter parameters across all other courtlistener tools.' An agent can tell this is the ID-discovery tool rather than any of the get_/search_ siblings without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not guidance: default is the active bench, pass status:'inactive' for historical courts, status:'any' for everything, and 'pull those only when a court ID alone is not enough.' It also directs the agent to prefer the narrowest filter and to narrow with jurisdiction rather than page the full list, which is a concrete routing rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_search_docketsSearch Federal Court DocketsA
Read-only
Inspect

Search RECAP federal court dockets. Query terms match case name, docket number, party, and attorney names; filters narrow by party name, court, and filing date. RECAP is a crowd-sourced mirror of PACER (the federal court filing system) — coverage varies by court and date. Returns docket metadata with the parties, attorneys, and firms of record, plus up to 3 sample document entries per docket. Use courtlistener_lookup_courts to find court IDs.

NameRequiredDescriptionDefault
qYesQuery terms matched against case name, docket number, party names, and attorney names. Example: "Apple Inc patent infringement".
courtNoFilter to a specific federal court ID (e.g., "dnd", "cacd", "deb" for Delaware Bankruptcy). Use courtlistener_lookup_courts to find court IDs.
cursorNoPagination cursor from a previous response's next_cursor field.
page_sizeNoPositive requested page size (default 20), bounded to 20. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full pages and continuation are preserved; page_sizing reports actual sizes.
party_nameNoFilter 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.
filed_afterNoEarliest case filing date (ISO 8601).
filed_beforeNoLatest case filing date (ISO 8601).

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when results are empty — echoes filters and suggests how to broaden.
resultsNoMatching docket records.
totalCountNoTotal matching dockets.
next_cursorNoPagination cursor for the next page; null when no more results.
page_sizingNoRequested, bounded, and actual page sizes.
coverage_noteNoNote about RECAP coverage limitations.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is covered. The description adds genuine behavioral context beyond that: RECAP is a crowd-sourced PACER mirror whose coverage varies by court and date, which materially affects how an agent should interpret sparse results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose and free of filler. The closing sentence describing return contents is somewhat redundant given an output schema exists, which keeps this just short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't detail return shape, and annotations cover safety. It supplies the important coverage caveat and the court-ID cross-reference, leaving only minor gaps such as pagination guidance, which the schema already handles.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter already carries a detailed description, including the party_name-vs-q precision note and pagination semantics. The description largely restates those fields (query matching surface, filter dimensions) without adding syntax or format detail, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("Search RECAP federal court dockets") and immediately scopes what the query matches and what the filters narrow. This cleanly distinguishes it from siblings like courtlistener_search_opinions and courtlistener_search_judges.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It routes the agent to courtlistener_lookup_courts for court IDs and warns that RECAP coverage varies by court and date, which is useful context. However, it never states when to use this search versus a direct fetch like courtlistener_get_docket, nor any when-not-to-use condition, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_search_financial_disclosuresSearch Financial DisclosuresA
Read-only
Inspect

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; the year filter is applied to the fetched page only (CourtListener has no server-side year filter), so page through with cursor to reach a judge's filings for a year that fall on later pages. Returns per-filing metadata, category counts, itemized gifts, and a link to the source PDF. Line-item investments (often hundreds per filing, with coded values) are summarized as counts; the linked PDF carries the full itemization. Use this for judicial-ethics and recusal research after identifying a judge's person ID.

NameRequiredDescriptionDefault
yearNoFiling year to filter by (e.g., 2022). Applied client-side to the fetched page only — CourtListener rejects a server-side year param, so filings for this year on later pages are not included. When a page has no match for the year but more pages remain, next_cursor is returned; pass it as cursor to check the next page. Omit to return all years on the page.
cursorNoPagination cursor from a previous response's next_cursor field.
judge_idNoPerson ID of the judge whose disclosures to return — obtain from courtlistener_search_judges (the person_id field). Omit to browse across all filers.
page_sizeNoPositive requested page size (default 20), bounded to 20. Upstream has a minimum of 20; final pages and page-local year filtering can return fewer. Full fetched pages and continuation are preserved; page_sizing reports returned sizes.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when no filings are found — echoes filters and suggests next steps.
resultsNoMatching financial disclosure filings.
totalCountNoTotal matching disclosure filings — present only when the API reports a numeric count (this endpoint returns it as a URL by default, so it is usually absent).
next_cursorNoPagination cursor for the next page; null when no more results.
page_sizingNoRequested, bounded, and actual page sizes.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/openWorld/idempotent annotations by disclosing a non-obvious upstream constraint (CourtListener rejects a server-side year param, so filtering is client-side and page-local) and the required cursor paging to reach a given year. It also flags that line-item investments are summarized as counts rather than returned in full, which materially affects expectations of the result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what the tool is and what it filters on, then layers the paging caveat and return-shape note. It is dense and somewhat long, but nearly every clause carries operational information; the final 'use this for' sentence could have been moved earlier.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still usefully previews return contents (per-filing metadata, category counts, itemized gifts, PDF link) and warns about summarized line items. Combined with the paging and filtering caveats, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema, including the client-side year behavior and cursor semantics. The description adds only the judge_id provenance note, which the schema also states; baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (federal judicial financial disclosure filings), then defines the resource concretely (annual reports covering investments, gifts, debts, outside positions, income). It is clearly distinguishable from the singular sibling courtlistener_get_financial_disclosure and names courtlistener_search_judges as the source for a judge's person ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use it 'for judicial-ethics and recusal research after identifying a judge's person ID,' and gives the precondition (person ID from courtlistener_search_judges). It explains the pagination workaround for the year filter, but never contrasts itself with courtlistener_get_financial_disclosure, so the alternative-selection guidance is incomplete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_search_judgesSearch JudgesA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
qYesSearch query — judge name, court, city, or relevant keywords.
courtNoFilter to judges who have held a position at this court (e.g., "scotus", "ca9"). Use court_id strings from courtlistener_lookup_courts.
cursorNoPagination cursor from a previous response's next_cursor field.
appointerNoFilter by appointing president's last name (e.g., "Obama", "Trump", "Biden"). Matches against the appointer field in position records.
page_sizeNoPositive requested page size (default 20), bounded to 20. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full pages and continuation are preserved; page_sizing reports actual sizes.
political_affiliationNoFilter 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.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when results are empty — echoes filters and suggests how to broaden.
resultsNoMatching judge records.
totalCountNoTotal matching judge records.
next_cursorNoPagination cursor for the next page; null when no more results.
page_sizingNoRequested, bounded, and actual page sizes.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=false, so the safety and repeatability profile is covered. The description adds that results include biographical data, current position, and appointment summary, but says nothing about pagination behavior, throttling, or result limits beyond what the schema conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with purpose and filters before the sibling pointer. The middle sentence about return contents is mildly redundant given the presence of an output schema, but it costs little.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, a 100% covered input schema, and annotations carrying the safety profile, the description only needs to state scope and route to the detail tool, which it does. The unexplained 'demographic' filter is the one loose end.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each parameter is already documented in detail (including cursor, page_size, and affiliation enum). The description restates the filter set but adds no syntax or format detail, and its mention of 'demographic' has no corresponding parameter, which is a minor inaccuracy rather than added meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb+resource ('Search judge/person records') and enumerates the searchable filter dimensions. It also differentiates itself from the detail sibling by name, so an agent can pick it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use courtlistener_get_judge for full appointment history and education records' gives an explicit alternative and the condition that favors it. It lacks any stated when-not-to-use for search itself, but the routing guidance is concrete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_search_opinionsSearch Court OpinionsA
Read-only
Inspect

Full-text search across 9M+ written US court opinions with field-level filtering. Returns opinion cluster summaries with case metadata, citations, matched text snippets, and the individual opinion variants filed in each case. Supports CourtListener field syntax (caseName:"roe v wade", court_id:scotus, judge:"Alito") and boolean operators (AND, OR, NOT). Use courtlistener_lookup_courts to find court IDs. CourtListener publishes free-tier limits of 5 req/min, 50/hr, 125/day; actual limits vary by token tier.

NameRequiredDescriptionDefault
qYesFull-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.
courtNoFilter to a specific court by court ID (e.g., "scotus", "ca9", "nyed"). Use courtlistener_lookup_courts to find court IDs.
cursorNoPagination cursor from a previous response's next_cursor field. Omit for the first page.
statusNoOpinion publication status. "Published": precedential. "Unpublished": not citable as precedent in most jurisdictions. "Errata": corrections. "Separate": separate opinion filed outside main cluster. "In-chambers": single-justice order. "Relating-to": companion or related-case order. Omit to use CourtListener’s Published default.
order_byNoResult ordering. "score desc" (default) ranks by relevance. "citeCount desc" surfaces most-cited opinions first.score desc
page_sizeNoPositive requested page size (default 20), bounded to 20 before retrieval. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full upstream pages and continuation are preserved; page_sizing reports requested, bounded and actual sizes.
filed_afterNoEarliest filing date (ISO 8601, e.g., "2020-01-01"). Narrows search to opinions filed on or after this date.
filed_beforeNoLatest filing date (ISO 8601). Narrows search to opinions filed before or on this date.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when results are empty — echoes filters and suggests how to broaden.
resultsNoMatching opinion cluster summaries.
totalCountNoTotal matching opinions in the corpus.
next_cursorNoPagination cursor for the next page; null when no more results.
page_sizingNoRequested, bounded, and actual page sizes.
effectiveQueryNoQuery terms sent to CourtListener.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true, idempotentHint=false), so the bar is lower. The description still adds real behavioral context the annotations cannot carry: published free-tier rate limits (5/min, 50/hr, 125/day) that vary by token tier, plus a note that results include matched text snippets and individual opinion variants. It stops short of auth requirements or failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences: what it searches, what it returns, then syntax and limits. Dense and largely waste-free, though the field-syntax examples and court-ID pointer duplicate the schema rather than adding new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with an output schema, an 8-param schema at full coverage, and annotations covering safety, the description supplies everything else an agent needs: result shape, query syntax, sibling routing for court IDs, pagination via cursor, and rate-limit constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all eight parameters are already documented in the schema — including the same field-syntax examples and the courtlistener_lookup_courts pointer that the description repeats. The description adds essentially no parameter meaning beyond the structured fields, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (full-text search), resource (9M+ written US court opinions), and scope (field-level filtering, returns cluster summaries). This is clearly distinguishable from siblings like courtlistener_get_opinion (fetch one) and courtlistener_search_dockets (docket search) without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear usage context: it routes the agent to courtlistener_lookup_courts for court IDs and discloses rate limits that constrain call patterns. It does not explicitly say when to prefer this over courtlistener_search_dockets or courtlistener_get_opinion, so no exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

courtlistener_search_oral_argumentsSearch Oral ArgumentsA
Read-only
Inspect

Search appellate oral argument audio recordings — the largest public collection of oral argument audio. Returns recording metadata with two direct MP3 links per result (download_url at the originating court, local_path for CourtListener's durable copy), panel judge IDs, and transcript snippets where available. Panel judge IDs can be passed to courtlistener_get_judge for biographical context.

NameRequiredDescriptionDefault
qYesQuery terms matched against case name and transcribed argument text (where available).
courtNoFilter to a specific court (e.g., "scotus", "ca9").
cursorNoPagination cursor from a previous response's next_cursor field.
page_sizeNoPositive requested page size (default 20), bounded to 20. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full pages and continuation are preserved; page_sizing reports actual sizes.
argued_afterNoEarliest date the case was argued (ISO 8601) — filters by argument date, not publication date.
argued_beforeNoLatest date the case was argued (ISO 8601).

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint when results are empty — echoes filters and suggests how to broaden.
resultsNoMatching oral argument recordings.
totalCountNoTotal matching oral argument recordings.
next_cursorNoPagination cursor for the next page; null when no more results.
page_sizingNoRequested, bounded, and actual page sizes.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is covered. The description goes beyond them by explaining the two distinct MP3 links (download_url at the originating court vs. local_path as CourtListener's durable copy) and by flagging that transcripts are only sometimes present — non-obvious content behavior that helps an agent interpret results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the purpose front-loaded before the return-value details. The second sentence is dense but each clause carries information; no filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description is not obligated to enumerate return fields, yet it usefully summarizes the shape (metadata, dual MP3 links, judge IDs, transcripts) and points to a natural next tool. An agent can invoke it correctly from description plus schema, though the lack of explicit usage/exclusion guidance is a minor remaining gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters including the unusual 20-row upstream minimum for page_size and the argued_after/argued_before date semantics. The description adds essentially nothing parameter-level beyond what the schema states, which is the expected baseline when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Search appellate oral argument audio recordings' — and immediately characterizes the corpus ('largest public collection of oral argument audio'), which makes it clearly distinct from search_opinions and search_dockets. It does not explicitly say 'use X instead of Y' for the sibling search tools, so it stops just short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the query matches case name and transcribed text, with optional court and date filtering. The one genuine routing hint is forwarding panel judge IDs to courtlistener_get_judge, which is a helpful follow-up workflow rather than a when-to-use rule. No exclusions or alternative-tool guidance are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 11 tool updates
    • Changedcourtlistener_get_citations11 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor from a previous response's next_cursor field."New value: +"Pagination cursor from next_cursor. For citing, a nonnegative safe decimal integer offset; for cited_by, an opaque upstream token."
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results to request (default 20). For direction=\"cited_by\", CourtListener enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 results. direction=\"citing\" returns at most page_size (the cited-opinion list is sliced before querying) — fewer when the opinion cites fewer than page_size distinct opinions. Either direction costs three requests against the rate limit (a case with many opinion variants costs one more per extra variant page) — keep low for multi-hop traversal."New value: +"Positive requested size (default 20), bounded to 20. cited_by has an upstream minimum of 20; citing slices at most 20 cited IDs by the bounded size before filtering. Full upstream pages are preserved. Final or filtered pages can be smaller or empty; retain next_cursor to continue. page_sizing distinguishes requested, bounded and actual sizes. A normal call costs three requests plus extra variant pages."
      • changedInput schema / properties / page_size / maximum
        Previous value: -20New value: +9007199254740991
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "source_cluster_id",
        -      "source_case_name",
        -      "direction",
        -      "results",
        -      "next_cursor",
        -      "totalCount"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "source_cluster_id",
        +      "source_case_name",
        +      "direction",
        +      "results",
        +      "next_cursor"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. Both directions resolve the source cluster before searching, so a bad ID fails here rather than returning an empty network. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `invalid_date`: filed_after is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_cursor`: A citing cursor is not a nonnegative safe decimal integer offset. `not_found`: Cluster ID does not exist in CourtListener. Both directions resolve the source cluster before searching, so a bad ID fails here rather than returning an empty network. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `invalid_date`: filed_after is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found",
        -  "rate_limited",
        -  "invalid_date"
        -]New value: +[
        +  "invalid_cursor",
        +  "not_found",
        +  "rate_limited",
        +  "invalid_date"
        +]
      • addedOutput schema / properties / observed_total
        Added value: +{
        +  "description": "Citation total observed from the fetched source variants; a lower bound when total_is_partial is true.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / source_variants_completion
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Completion of the source opinion-variant walk.",
        +  "properties": {
        +    "complete": {
        +      "description": "True only when all source variants were fetched.",
        +      "type": "boolean"
        +    },
        +    "next_cursor": {
        +      "description": "Remaining upstream variant cursor; null at the end.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "complete",
        +    "next_cursor"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total citations in the requested direction. For \"cited_by\" it counts matching clusters with the court and filed_after filters applied. For \"citing\" it counts the distinct opinions this case cites, before any filter — so it exceeds what the filters make reachable, and runs higher than the result rows, which are clusters (several cited opinions in one case collapse to one row)."New value: +"Exact total for the fetched direction when source variants are complete; absent when total_is_partial is true. For cited_by this counts matching clusters after filters; for citing it counts distinct cited opinions before any filter, which can exceed the cluster rows."
      • addedOutput schema / properties / total_is_partial
        Added value: +{
        +  "description": "True when citation results and totals are based on an incomplete source-variant set.",
        +  "type": "boolean"
        +}
    • Changedcourtlistener_get_docket4 fields changed
      • changedInput schema / properties / entries_page_size / maximum
        Previous value: -50New value: +9007199254740991
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / total_entries / description
        Previous value: -"Total number of docket entries available — may exceed the returned entries list."New value: +"Total number of docket entries available; null when upstream supplies no numeric total. May exceed the returned entries list."
      • changedOutput schema / properties / total_entries / type
        Previous value: -"number"New value: +[
        +  "number",
        +  "null"
        +]
    • Changedcourtlistener_get_financial_disclosure26 fields changed
      • changedInput schema / properties / categories / description
        Previous value: -"Line-item categories to return in full: investments, debts, positions, reimbursements, non_investment_incomes, spouse_incomes, agreements, gifts. Omit for all categories (or an outline if they overflow the inline budget). Also the re-call selector — after an outline response, re-call with the category names it lists."New value: +"Line-item categories to select. Omit for all. Oversized selections page; keep this selection unchanged while following cursor."
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Retrieval next_cursor from the previous response. Repeat the original ID and sections/categories selection unchanged; omit to start.",
        +  "maxLength": 1024,
        +  "type": "string"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "disclosure_id",
        -      "person_id",
        -      "year",
        -      "report_type",
        -      "page_count",
        -      "has_been_extracted",
        -      "is_amended",
        -      "pdf_url",
        -      "counts",
        -      "kind"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "disclosure_id",
        +      "person_id",
        +      "year",
        +      "page_count",
        +      "has_been_extracted",
        +      "is_amended",
        +      "counts",
        +      "kind"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / agreements / items / description
        Previous value: -"A continuing agreement or arrangement (Part VIII)."New value: +"A continuing agreement or arrangement (Part VIII); omitted partial strings remain reachable through retrieval."
      • changedOutput schema / properties / agreements / items / required
        Previous value: -[
        -  "id",
        -  "date",
        -  "parties_and_terms",
        -  "redacted"
        -]New value: +[
        +  "id",
        +  "redacted"
        +]
      • changedOutput schema / properties / debts / items / description
        Previous value: -"A debt or liability (Part VII)."New value: +"A debt or liability (Part VII); omitted partial strings remain reachable through retrieval."
      • changedOutput schema / properties / debts / items / required
        Previous value: -[
        -  "id",
        -  "creditor",
        -  "description",
        -  "value_range",
        -  "redacted"
        -]New value: +[
        +  "id",
        +  "redacted"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Disclosure ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_cursor`: Retrieval cursor is malformed, out of range or belongs to another request. `stale_cursor`: The normalized selected source changed since the previous page. `not_found`: Disclosure ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found",
        -  "rate_limited"
        -]New value: +[
        +  "invalid_cursor",
        +  "stale_cursor",
        +  "not_found",
        +  "rate_limited"
        +]
      • changedOutput schema / properties / gifts / items / description
        Previous value: -"A reported gift (Part VI)."New value: +"A reported gift (Part VI); omitted partial strings remain reachable through retrieval."
      • removedOutput schema / properties / gifts / items / required
        Removed value: -[
        -  "description",
        -  "source",
        -  "value"
        -]
      • changedOutput schema / properties / investments / items / description
        Previous value: -"An investment holding (Part VII)."New value: +"An investment holding (Part VII); omitted partial strings remain reachable through retrieval."
      • changedOutput schema / properties / investments / items / required
        Previous value: -[
        -  "id",
        -  "description",
        -  "income_type",
        -  "income_range",
        -  "value_range",
        -  "value_method",
        -  "transaction",
        -  "transaction_date",
        -  "transaction_value_range",
        -  "transaction_gain_range",
        -  "transaction_partner",
        -  "redacted"
        -]New value: +[
        +  "id",
        +  "redacted"
        +]
      • changedOutput schema / properties / kind / description
        Previous value: -"'full' returns the requested category rows; 'outline' lists each category as a retrievable section (by byte size) when the itemization overflows the inline budget. Filing metadata and counts are present either way."New value: +"'full' carries a small selected record; 'outline' pages the section catalog; 'page' carries typed rows and field-path text chunks. Filing identity and counts remain present."
      • changedOutput schema / properties / kind / enum
        Previous value: -[
        -  "full",
        -  "outline"
        -]New value: +[
        +  "full",
        +  "outline",
        +  "page"
        +]
      • changedOutput schema / properties / non_investment_incomes / items / description
        Previous value: -"The filer's non-investment income (Part II)."New value: +"The filer's non-investment income (Part II); omitted partial strings remain reachable through retrieval."
      • changedOutput schema / properties / non_investment_incomes / items / required
        Previous value: -[
        -  "id",
        -  "date",
        -  "source_type",
        -  "amount",
        -  "redacted"
        -]New value: +[
        +  "id",
        +  "redacted"
        +]
      • changedOutput schema / properties / positions / items / description
        Previous value: -"An outside position held by the filer (Part I)."New value: +"An outside position held by the filer (Part I); omitted partial strings remain reachable through retrieval."
      • changedOutput schema / properties / positions / items / required
        Previous value: -[
        -  "id",
        -  "position",
        -  "organization",
        -  "redacted"
        -]New value: +[
        +  "id",
        +  "redacted"
        +]
      • changedOutput schema / properties / reimbursements / items / description
        Previous value: -"A travel/event reimbursement (Part IV)."New value: +"A travel/event reimbursement (Part IV); omitted partial strings remain reachable through retrieval."
      • changedOutput schema / properties / reimbursements / items / required
        Previous value: -[
        -  "id",
        -  "source",
        -  "date",
        -  "location",
        -  "purpose",
        -  "items",
        -  "redacted"
        -]New value: +[
        +  "id",
        +  "redacted"
        +]
      • addedOutput schema / properties / retrieval
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Caller retrieval completion, separate from upstream source completion.",
        +  "properties": {
        +    "next_cursor": {
        +      "description": "Continue with cursor and the same ID/selection; null when this fetched view is exhausted.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "ranges": {
        +      "description": "Absolute source coordinates; merge typed rows by index rather than appending duplicates.",
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Source range.",
        +        "properties": {
        +          "end": {
        +            "description": "Exclusive absolute end.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "path": {
        +            "description": "JSON Pointer into the normalized unsliced selected view.",
        +            "type": "string"
        +          },
        +          "start": {
        +            "description": "Inclusive absolute start.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "total": {
        +            "description": "Length of the complete normalized collection or text field.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "unit": {
        +            "description": "Coordinate unit.",
        +            "enum": [
        +              "rows",
        +              "code_points",
        +              "sections"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "path",
        +          "unit",
        +          "start",
        +          "end",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "text_chunks": {
        +      "description": "Text omitted from partial rows/metadata, recoverable exactly using the matching ranges.",
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Readable string slice.",
        +        "properties": {
        +          "path": {
        +            "description": "JSON Pointer of the original string field or string-array element.",
        +            "type": "string"
        +          },
        +          "text": {
        +            "description": "Unescaped normalized substring, matching its code_points range.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "path",
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "next_cursor",
        +    "ranges",
        +    "text_chunks"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / retrieval_notice / description
        Previous value: -"How to re-call the tool for specific categories when the itemization overflows."New value: +"How to continue bounded retrieval using the unchanged ID and selection."
      • changedOutput schema / properties / sections / description
        Previous value: -"Retrievable categories, largest first — pass names to `categories` on a re-call."New value: +"Category catalog in declared order, with paged metadata fields. Follow retrieval.next_cursor to finish the catalog and retrieve data."
      • changedOutput schema / properties / spouse_incomes / items / description
        Previous value: -"The filer's spouse income (Part III)."New value: +"The filer's spouse income (Part III); omitted partial strings remain reachable through retrieval."
      • changedOutput schema / properties / spouse_incomes / items / required
        Previous value: -[
        -  "id",
        -  "source_type",
        -  "date",
        -  "redacted"
        -]New value: +[
        +  "id",
        +  "redacted"
        +]
    • Changedcourtlistener_get_opinion16 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Retrieval next_cursor from the previous response. Repeat the original ID and sections/categories selection unchanged; omit to start.",
        +  "maxLength": 1024,
        +  "type": "string"
        +}
      • changedInput schema / properties / sections / description
        Previous value: -"Opinion variant identifiers to retrieve in full, from a prior outline response (e.g. [\"opinion_12345\"]). Omit to return all variants, or an outline if they overflow the inline byte budget."New value: +"Opinion variant identifiers to select (e.g. [\"opinion_12345\"]). Omit for all fetched variants. Oversized selections page; keep this selection unchanged while following cursor."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "cluster_id",
        -      "case_name",
        -      "case_name_full",
        -      "court",
        -      "court_id",
        -      "date_filed",
        -      "docket_id",
        -      "docket_number",
        -      "judges",
        -      "citations",
        -      "cite_count",
        -      "precedential_status",
        -      "syllabus",
        -      "posture",
        -      "kind"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cluster_id",
        +      "docket_id",
        +      "cite_count",
        +      "kind"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / docket_enrichment
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Linked-docket enrichment outcome, independent of opinion text availability.",
        +  "properties": {
        +    "error_code": {
        +      "description": "Sanitized MCP error code when the lookup failed.",
        +      "type": "number"
        +    },
        +    "reason": {
        +      "description": "Safe lookup failure category, without upstream error text.",
        +      "enum": [
        +        "not_found",
        +        "lookup_failed"
        +      ],
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Outcome of the optional linked-docket lookup.",
        +      "enum": [
        +        "not_linked",
        +        "resolved",
        +        "source_fields_absent",
        +        "lookup_failed"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `unknown_section`: A requested sections name matches no opinion variant in this cluster. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_cursor`: Retrieval cursor is malformed, out of range or belongs to another request. `stale_cursor`: The normalized selected source changed since the previous page. `not_found`: Cluster ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `unknown_section`: A requested sections name matches no opinion variant in this cluster. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found",
        -  "rate_limited",
        -  "unknown_section"
        -]New value: +[
        +  "invalid_cursor",
        +  "stale_cursor",
        +  "not_found",
        +  "rate_limited",
        +  "unknown_section"
        +]
      • changedOutput schema / properties / kind / description
        Previous value: -"'full' returns the opinion variants (all, or a selected subset); 'outline' lists each variant as a retrievable section (opinion_<id>) when the opinions overflow the inline byte budget. Cluster metadata is present either way."New value: +"'full' carries a small selected record; 'outline' pages the section catalog; 'page' carries typed rows and field-path text chunks. Bounded identity remains present throughout retrieval."
      • changedOutput schema / properties / kind / enum
        Previous value: -[
        -  "full",
        -  "outline"
        -]New value: +[
        +  "full",
        +  "outline",
        +  "page"
        +]
      • changedOutput schema / properties / opinions / description
        Previous value: -"All opinion variants within this cluster. Present in full mode; omitted in outline mode — re-call with sections:[\"opinion_<id>\"] to retrieve specific variants."New value: +"Fetched variants; variants_completion describes source coverage. Pages can contain partial typed variants; omitted text is recoverable through retrieval.text_chunks at original field paths."
      • changedOutput schema / properties / opinions / items / description
        Previous value: -"Individual opinion variant."New value: +"Individual opinion variant; omitted partial fields are recoverable through retrieval."
      • changedOutput schema / properties / opinions / items / properties / plain_text / description
        Previous value: -"Plain text version of the opinion; may be empty."New value: +"Supplied plain text preserved exactly, or readable text derived from source markup when absent; empty if neither exists."
      • changedOutput schema / properties / opinions / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "type_label",
        -  "author_id",
        -  "per_curiam",
        -  "html_text",
        -  "plain_text",
        -  "cites",
        -  "download_url"
        -]New value: +[
        +  "id",
        +  "author_id",
        +  "per_curiam"
        +]
      • addedOutput schema / properties / retrieval
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Caller retrieval completion, separate from upstream source completion.",
        +  "properties": {
        +    "next_cursor": {
        +      "description": "Continue with cursor and the same ID/selection; null when this fetched view is exhausted.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "ranges": {
        +      "description": "Absolute source coordinates; merge typed rows by index rather than appending duplicates.",
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Source range.",
        +        "properties": {
        +          "end": {
        +            "description": "Exclusive absolute end.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "path": {
        +            "description": "JSON Pointer into the normalized unsliced selected view.",
        +            "type": "string"
        +          },
        +          "start": {
        +            "description": "Inclusive absolute start.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "total": {
        +            "description": "Length of the complete normalized collection or text field.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "unit": {
        +            "description": "Coordinate unit.",
        +            "enum": [
        +              "rows",
        +              "code_points",
        +              "sections"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "path",
        +          "unit",
        +          "start",
        +          "end",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "text_chunks": {
        +      "description": "Text omitted from partial rows/metadata, recoverable exactly using the matching ranges.",
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Readable string slice.",
        +        "properties": {
        +          "path": {
        +            "description": "JSON Pointer of the original string field or string-array element.",
        +            "type": "string"
        +          },
        +          "text": {
        +            "description": "Unescaped normalized substring, matching its code_points range.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "path",
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "next_cursor",
        +    "ranges",
        +    "text_chunks"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / retrieval_notice / description
        Previous value: -"How to re-call the tool for specific opinion variants when the opinions overflow."New value: +"How to continue bounded retrieval using the unchanged ID and selection."
      • changedOutput schema / properties / sections / description
        Previous value: -"Retrievable opinion variants, largest first — pass names to `sections` on a re-call."New value: +"Section catalog in source order, including paged metadata. Only opinion_<id> names select variants; follow retrieval.next_cursor to finish the catalog and retrieve data."
      • addedOutput schema / properties / variants_completion
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Source-walk completion. An oversized upstream next_cursor is omitted on partial responses and recovered at /variants_completion/next_cursor through retrieval.text_chunks.",
        +  "properties": {
        +    "complete": {
        +      "description": "True only when all source variants were fetched.",
        +      "type": "boolean"
        +    },
        +    "next_cursor": {
        +      "description": "Remaining upstream variant cursor; null at the end.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "complete"
        +  ],
        +  "type": "object"
        +}
    • Changedcourtlistener_get_oral_argument10 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Retrieval next_cursor from the previous response. Repeat the original ID and sections/categories selection unchanged; omit to start.",
        +  "maxLength": 1024,
        +  "type": "string"
        +}
      • changedInput schema / properties / sections / description
        Previous value: -"Section identifiers to retrieve, from a prior outline response — [\"transcript\"] is the only one that adds anything, since every other field is returned regardless. A selection that omits \"transcript\" therefore returns the record without it. Omit this argument entirely for the whole record, or the record minus an oversized transcript."New value: +"Selected record fields. Metadata is always selected; a nonempty selection omitting transcript excludes it. Omit for the whole record. Oversized selections page; keep this selection unchanged while following cursor."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Audio ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `unknown_section`: A requested sections name is not a field of the oral argument record. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_cursor`: Retrieval cursor is malformed, out of range or belongs to another request. `stale_cursor`: The normalized selected source changed since the previous page. `not_found`: Audio ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `unknown_section`: A requested sections name is not a field of the oral argument record. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "not_found",
        -  "rate_limited",
        -  "unknown_section"
        -]New value: +[
        +  "invalid_cursor",
        +  "stale_cursor",
        +  "not_found",
        +  "rate_limited",
        +  "unknown_section"
        +]
      • changedOutput schema / properties / kind / description
        Previous value: -"'full' carries the transcript inline; 'outline' withholds it and lists it as a retrievable section because it overflows the inline byte budget. Every other field of the record is present either way."New value: +"'full' carries a small selected record; 'outline' pages the section catalog; 'page' carries fields and text chunks. Bounded identity remains present throughout retrieval."
      • changedOutput schema / properties / kind / enum
        Previous value: -[
        -  "full",
        -  "outline"
        -]New value: +[
        +  "full",
        +  "outline",
        +  "page"
        +]
      • addedOutput schema / properties / retrieval
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Caller retrieval completion, separate from upstream source completion.",
        +  "properties": {
        +    "next_cursor": {
        +      "description": "Continue with cursor and the same ID/selection; null when this fetched view is exhausted.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "ranges": {
        +      "description": "Absolute source coordinates; merge typed rows by index rather than appending duplicates.",
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Source range.",
        +        "properties": {
        +          "end": {
        +            "description": "Exclusive absolute end.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "path": {
        +            "description": "JSON Pointer into the normalized unsliced selected view.",
        +            "type": "string"
        +          },
        +          "start": {
        +            "description": "Inclusive absolute start.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "total": {
        +            "description": "Length of the complete normalized collection or text field.",
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "unit": {
        +            "description": "Coordinate unit.",
        +            "enum": [
        +              "rows",
        +              "code_points",
        +              "sections"
        +            ],
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "path",
        +          "unit",
        +          "start",
        +          "end",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "text_chunks": {
        +      "description": "Text omitted from partial rows/metadata, recoverable exactly using the matching ranges.",
        +      "items": {
        +        "additionalProperties": false,
        +        "description": "Readable string slice.",
        +        "properties": {
        +          "path": {
        +            "description": "JSON Pointer of the original string field or string-array element.",
        +            "type": "string"
        +          },
        +          "text": {
        +            "description": "Unescaped normalized substring, matching its code_points range.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "path",
        +          "text"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "next_cursor",
        +    "ranges",
        +    "text_chunks"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / retrieval_notice / description
        Previous value: -"How to re-call the tool for the transcript when it overflows the inline budget."New value: +"How to continue bounded retrieval using the unchanged ID and selection."
      • changedOutput schema / properties / sections / description
        Previous value: -"Sections withheld from this response — only ever `transcript`; pass its name to `sections` on a re-call. Absent when nothing was withheld."New value: +"Section catalog: transcript and paged metadata fields. Follow retrieval.next_cursor to finish the catalog and retrieve data."
      • changedOutput schema / properties / transcript / description
        Previous value: -"Speech-to-text transcript; empty string if transcription has not completed. The only field an outline response withholds — re-call with sections:[\"transcript\"] to retrieve it."New value: +"Speech-to-text transcript; empty if transcription has not completed. Oversized text is recovered through retrieval.text_chunks at /transcript."
    • Changedcourtlistener_get_parties6 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Requested number of parties per page (1–10). CourtListener paginates this endpoint at a fixed size and does not honor the requested value, so a page can come back larger than asked for."New value: +"Positive requested party page size (default 10), bounded to 10 before retrieval. CourtListener uses fixed 20-row pages and ignores this request; final pages can be smaller. page_sizing reports requested, bounded and actual sizes."
      • changedInput schema / properties / page_size / maximum
        Previous value: -10New value: +9007199254740991
      • addedOutput schema / properties / attorney_resolution
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Attorney lookup completeness; no additional automatic requests are made.",
        +  "properties": {
        +    "next_cursor": {
        +      "description": "Remaining attorney-roster cursor; null when exhausted.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "status": {
        +      "description": "Resolved all needed IDs, exhausted roster with misses, or stopped at the page cap.",
        +      "enum": [
        +        "resolved",
        +        "exhausted",
        +        "capped"
        +      ],
        +      "type": "string"
        +    },
        +    "unresolved_ids": {
        +      "description": "Attorney IDs still unresolved on this parties page.",
        +      "items": {
        +        "type": "number"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "unresolved_ids",
        +    "next_cursor"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener or has no RECAP party data. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Each call to this tool makes at least two upstream requests. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener or has no RECAP party data. `rate_limited`: 429 from CourtListener, or no request slot opened before any attorney roster page completed. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / parties / items / properties / attorneys / items / properties / resolution
        Added value: +{
        +  "description": "Whether detail was resolved (possibly with empty source fields), absent from an exhausted roster, or unknown after the cap.",
        +  "enum": [
        +    "resolved",
        +    "not_found",
        +    "not_fetched"
        +  ],
        +  "type": "string"
        +}
    • Changedcourtlistener_search_dockets3 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"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."New value: +"Positive requested page size (default 20), bounded to 20. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full pages and continuation are preserved; page_sizing reports actual sizes."
      • changedInput schema / properties / page_size / maximum
        Previous value: -20New value: +9007199254740991
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
    • Changedcourtlistener_search_financial_disclosures3 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of filings to request (default 20). CourtListener enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 filings."New value: +"Positive requested page size (default 20), bounded to 20. Upstream has a minimum of 20; final pages and page-local year filtering can return fewer. Full fetched pages and continuation are preserved; page_sizing reports returned sizes."
      • changedInput schema / properties / page_size / maximum
        Previous value: -20New value: +9007199254740991
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
    • Changedcourtlistener_search_judges3 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results to request (default 20). CourtListener search enforces a minimum of 20 results per page regardless of the value passed."New value: +"Positive requested page size (default 20), bounded to 20. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full pages and continuation are preserved; page_sizing reports actual sizes."
      • changedInput schema / properties / page_size / maximum
        Previous value: -20New value: +9007199254740991
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
    • Changedcourtlistener_search_opinions4 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"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 costs one request against the rate limit."New value: +"Positive requested page size (default 20), bounded to 20 before retrieval. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full upstream pages and continuation are preserved; page_sizing reports requested, bounded and actual sizes."
      • changedInput schema / properties / page_size / maximum
        Previous value: -20New value: +9007199254740991
      • changedInput schema / properties / status / description
        Previous value: -"Opinion publication status. \"Published\": precedential. \"Unpublished\": not citable as precedent in most jurisdictions. \"Errata\": corrections. \"Separate\": separate opinion filed outside main cluster. \"In-chambers\": single-justice order. \"Relating-to\": companion or related-case order. Omit to search all statuses."New value: +"Opinion publication status. \"Published\": precedential. \"Unpublished\": not citable as precedent in most jurisdictions. \"Errata\": corrections. \"Separate\": separate opinion filed outside main cluster. \"In-chambers\": single-justice order. \"Relating-to\": companion or related-case order. Omit to use CourtListener’s Published default."
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
    • Changedcourtlistener_search_oral_arguments3 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results to request (default 20). CourtListener search enforces a minimum of 20 results per page regardless of the value passed."New value: +"Positive requested page size (default 20), bounded to 20. Upstream search has a 20-row minimum; empty and final pages can be smaller. Full pages and continuation are preserved; page_sizing reports actual sizes."
      • changedInput schema / properties / page_size / maximum
        Previous value: -20New value: +9007199254740991
      • addedOutput schema / properties / page_sizing
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Requested, bounded, and actual page sizes.",
        +  "properties": {
        +    "actual": {
        +      "description": "Rows returned to the caller after any page-local filters.",
        +      "type": "number"
        +    },
        +    "bounded": {
        +      "description": "Size sent upstream or used for the cited-ID slice.",
        +      "type": "number"
        +    },
        +    "requested": {
        +      "description": "Caller-requested page size.",
        +      "type": "number"
        +    },
        +    "upstream": {
        +      "description": "Upstream minimum, fixed page, or cited-ID slicing policy; final pages may contain fewer rows.",
        +      "enum": [
        +        "minimum_20",
        +        "fixed_20",
        +        "cited_id_slice"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "requested",
        +    "bounded",
        +    "actual",
        +    "upstream"
        +  ],
        +  "type": "object"
        +}
  2. 4 tool updates
    • Changedcourtlistener_search_dockets2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_query`: CourtListener rejects caller-authored query or filter syntax with a recognized diagnostic. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "empty_query",
        -  "invalid_date"
        -]New value: +[
        +  "invalid_query",
        +  "rate_limited",
        +  "empty_query",
        +  "invalid_date"
        +]
    • Changedcourtlistener_search_judges2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_query`: CourtListener rejects caller-authored query or filter syntax with a recognized diagnostic. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "empty_query"
        -]New value: +[
        +  "invalid_query",
        +  "rate_limited",
        +  "empty_query"
        +]
    • Changedcourtlistener_search_opinions2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_query`: CourtListener rejects caller-authored query or filter syntax with a recognized diagnostic. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "empty_query",
        -  "invalid_date"
        -]New value: +[
        +  "invalid_query",
        +  "rate_limited",
        +  "empty_query",
        +  "invalid_date"
        +]
    • Changedcourtlistener_search_oral_arguments2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: argued_after or argued_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_query`: CourtListener rejects caller-authored query or filter syntax with a recognized diagnostic. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: argued_after or argued_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "empty_query",
        -  "invalid_date"
        -]New value: +[
        +  "invalid_query",
        +  "rate_limited",
        +  "empty_query",
        +  "invalid_date"
        +]
  3. 14 tool updates
    • Changedcourtlistener_get_citations3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. Both directions resolve the source cluster before searching, so a bad ID fails here rather than returning an empty network. `rate_limited`: 429 response from CourtListener. `invalid_date`: filed_after is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. Both directions resolve the source cluster before searching, so a bad ID fails here rather than returning an empty network. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `invalid_date`: filed_after is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_get_docket21 fields changed
      • removedOutput schema / properties / assigned_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / assigned_to / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / date_terminated / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / date_terminated / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / entries / items / properties / documents / items / properties / attachment_number / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / entries / items / properties / documents / items / properties / attachment_number / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / entries / items / properties / documents / items / properties / document_number / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / entries / items / properties / documents / items / properties / document_number / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / entries / items / properties / documents / items / properties / filepath_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / entries / items / properties / documents / items / properties / filepath_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / entries / items / properties / documents / items / properties / page_count / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / entries / items / properties / documents / items / properties / page_count / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / entries / items / properties / entry_number / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / entries / items / properties / entry_number / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / pacer_case_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pacer_case_id / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / referred_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / referred_to / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_get_financial_disclosure7 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Disclosure ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Disclosure ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / page_count / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / page_count / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / pdf_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / pdf_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / person_id / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / person_id / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcourtlistener_get_judge45 fields changed
      • removedOutput schema / properties / dob / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dob / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / dob_city / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dob_city / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / dob_granularity / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dob_granularity / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / dob_state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dob_state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / dod / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dod / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / dod_granularity / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / dod_granularity / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / education / items / properties / degree / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / education / items / properties / degree / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / education / items / properties / degree_label / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / education / items / properties / degree_label / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / education / items / properties / year / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / education / items / properties / year / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Person ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Person ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / fjc_id / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / fjc_id / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / political_affiliations / items / properties / date_end / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / political_affiliations / items / properties / date_end / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / political_affiliations / items / properties / date_start / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / political_affiliations / items / properties / date_start / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / appointer / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / appointer / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / date_confirmation / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / date_confirmation / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / date_nominated / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / date_nominated / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / date_start / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / date_start / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / date_start_granularity / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / date_start_granularity / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / date_termination / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / date_termination / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / date_termination_granularity / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / date_termination_granularity / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / nomination_process / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / nomination_process / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / termination_reason / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / termination_reason / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / positions / items / properties / termination_reason_label / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / positions / items / properties / termination_reason_label / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_get_opinion5 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. `unknown_section`: A requested sections name matches no opinion variant in this cluster. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `unknown_section`: A requested sections name matches no opinion variant in this cluster. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / opinions / items / properties / author_id / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / opinions / items / properties / author_id / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / opinions / items / properties / download_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / opinions / items / properties / download_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_get_oral_argument3 fields changed
      • removedOutput schema / properties / download_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / download_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Audio ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. `unknown_section`: A requested sections name is not a field of the oral argument record. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Audio ID does not exist in CourtListener. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `unknown_section`: A requested sections name is not a field of the oral argument record. Other values are possible when a failure originates below the handler."
    • Changedcourtlistener_get_parties11 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener or has no RECAP party data. `rate_limited`: 429 response from CourtListener. Each call to this tool makes at least two upstream requests. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener or has no RECAP party data. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Each call to this tool makes at least two upstream requests. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / parties / items / properties / attorneys / items / properties / date_action / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / parties / items / properties / attorneys / items / properties / date_action / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / parties / items / properties / attorneys / items / properties / role_code / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / parties / items / properties / attorneys / items / properties / role_code / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / parties / items / properties / role / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / parties / items / properties / role / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / total_parties / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / total_parties / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcourtlistener_lookup_citation21 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `not_found`: CourtListener could not parse any citation out of the submitted text. A citation that parses but matches nothing is a result with status 404, not this error. `rate_limited`: 429 response from CourtListener. `empty_citation`: citation is empty or whitespace-only after trimming — no request is sent. `citation_too_long`: citation exceeds the 64000-character ceiling CourtListener accepts — no request is sent. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `not_found`: CourtListener could not parse any citation out of the submitted text. A citation that parses but matches nothing is a result with status 404, not this error. `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_citation`: citation is empty or whitespace-only after trimming — no request is sent. `citation_too_long`: citation exceeds the 64000-character ceiling CourtListener accepts — no request is sent. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / case_name / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / case_name / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / cite_count / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / cite_count / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / cluster_id / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / cluster_id / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / court / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / court / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / court_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / court_id / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / date_filed / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / date_filed / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / docket_id / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / docket_id / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / judges / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / judges / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / clusters / items / properties / precedential_status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / precedential_status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / matches / items / properties / normalized_citation / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / matches / items / properties / normalized_citation / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_lookup_courts3 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_search_dockets19 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / assigned_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / assigned_to / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / date_terminated / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / date_terminated / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / pacer_case_id / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / pacer_case_id / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / referred_to / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / referred_to / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / sample_documents / items / properties / document_number / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / document_number / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / sample_documents / items / properties / entry_number / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / entry_number / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / sample_documents / items / properties / filepath_local / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / filepath_local / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / sample_documents / items / properties / page_count / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / page_count / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcourtlistener_search_financial_disclosures9 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / page_count / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / page_count / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / pdf_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / pdf_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / person_id / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / person_id / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcourtlistener_search_judges10 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / results / items / properties / current_position / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "appointer": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Name of the appointing president (e.g. \"Obama, Barack Hussein, II\"); null if elected or not recorded."
        -      },
        -      "court": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Court full name; null for non-judicial positions."
        -      },
        -      "court_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Court identifier for use in filter parameters; null for non-judicial positions."
        -      },
        -      "date_start": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Date the position started; null if not recorded."
        -      },
        -      "date_termination": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Date the position ended; null while the judge still holds it."
        -      },
        -      "job_title": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Free-text title for non-judicial roles (e.g. \"Assistant district attorney\"); null for judicial positions."
        -      },
        -      "organization_name": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Employer for non-judicial roles; null for judicial positions."
        -      },
        -      "position_type": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Judicial position title (e.g. \"Judge\", \"Chief Judge\"); null for non-judicial positions — see job_title."
        -      },
        -      "selection_method": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "How the judge reached the position (e.g. \"Appointment (President)\", \"Election (Partisan)\"); null if not recorded."
        -      },
        -      "termination_reason": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Why the position ended (e.g. \"Appointed to Other Judgeship\", \"Retirement\"); null while still serving."
        -      }
        -    },
        -    "required": [
        -      "court",
        -      "court_id",
        -      "position_type",
        -      "job_title",
        -      "organization_name",
        -      "appointer",
        -      "selection_method",
        -      "date_start",
        -      "date_termination",
        -      "termination_reason"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "appointer": {
        +        "description": "Name of the appointing president (e.g. \"Obama, Barack Hussein, II\"); null if elected or not recorded.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "court": {
        +        "description": "Court full name; null for non-judicial positions.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "court_id": {
        +        "description": "Court identifier for use in filter parameters; null for non-judicial positions.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "date_start": {
        +        "description": "Date the position started; null if not recorded.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "date_termination": {
        +        "description": "Date the position ended; null while the judge still holds it.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "job_title": {
        +        "description": "Free-text title for non-judicial roles (e.g. \"Assistant district attorney\"); null for judicial positions.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "organization_name": {
        +        "description": "Employer for non-judicial roles; null for judicial positions.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "position_type": {
        +        "description": "Judicial position title (e.g. \"Judge\", \"Chief Judge\"); null for non-judicial positions — see job_title.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "selection_method": {
        +        "description": "How the judge reached the position (e.g. \"Appointment (President)\", \"Election (Partisan)\"); null if not recorded.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "termination_reason": {
        +        "description": "Why the position ended (e.g. \"Appointed to Other Judgeship\", \"Retirement\"); null while still serving.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "court",
        +      "court_id",
        +      "position_type",
        +      "job_title",
        +      "organization_name",
        +      "appointer",
        +      "selection_method",
        +      "date_start",
        +      "date_termination",
        +      "termination_reason"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / results / items / properties / dob / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / dob / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / dob_city / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / dob_city / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / dob_state / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / dob_state / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_search_opinions10 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener — minute, hour, or day throttle hit. `invalid_query`: Query uses invalid field syntax or unsupported operators. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "rate_limited",
        -  "invalid_query",
        -  "empty_query",
        -  "invalid_date"
        -]New value: +[
        +  "rate_limited",
        +  "empty_query",
        +  "invalid_date"
        +]
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / opinions / items / properties / author_id / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / opinions / items / properties / author_id / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / opinions / items / properties / download_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / opinions / items / properties / download_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / opinions / items / properties / local_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / opinions / items / properties / local_path / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedcourtlistener_search_oral_arguments9 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: argued_after or argued_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 from CourtListener, or no request slot opened within the wait budget. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: argued_after or argued_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / next_cursor / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / next_cursor / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / date_argued / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / date_argued / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / download_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / download_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / local_path / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / local_path / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  4. 14 tool updates
    • Changedcourtlistener_get_citations6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "source_cluster_id",
        +      "source_case_name",
        +      "direction",
        +      "results",
        +      "next_cursor",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. Both directions resolve the source cluster before searching, so a bad ID fails here rather than returning an empty network. `rate_limited`: 429 response from CourtListener. `invalid_date`: filed_after is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited",
        +            "invalid_date"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "source_cluster_id",
        -  "source_case_name",
        -  "direction",
        -  "results",
        -  "next_cursor",
        -  "totalCount"
        -]
    • Changedcourtlistener_get_docket6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "docket_id",
        +      "case_name",
        +      "case_name_full",
        +      "court",
        +      "court_id",
        +      "date_filed",
        +      "date_terminated",
        +      "docket_number",
        +      "pacer_case_id",
        +      "assigned_to",
        +      "referred_to",
        +      "cause",
        +      "jury_demand",
        +      "jurisdiction_type",
        +      "total_entries",
        +      "entries_page",
        +      "next_cursor",
        +      "entries"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "docket_id",
        -  "case_name",
        -  "case_name_full",
        -  "court",
        -  "court_id",
        -  "date_filed",
        -  "date_terminated",
        -  "docket_number",
        -  "pacer_case_id",
        -  "assigned_to",
        -  "referred_to",
        -  "cause",
        -  "jury_demand",
        -  "jurisdiction_type",
        -  "total_entries",
        -  "entries_page",
        -  "next_cursor",
        -  "entries"
        -]
    • Changedcourtlistener_get_financial_disclosure6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "disclosure_id",
        +      "person_id",
        +      "year",
        +      "report_type",
        +      "page_count",
        +      "has_been_extracted",
        +      "is_amended",
        +      "pdf_url",
        +      "counts",
        +      "kind"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Disclosure ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "disclosure_id",
        -  "person_id",
        -  "year",
        -  "report_type",
        -  "page_count",
        -  "has_been_extracted",
        -  "is_amended",
        -  "pdf_url",
        -  "counts",
        -  "kind"
        -]
    • Changedcourtlistener_get_judge6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "person_id",
        +      "name",
        +      "gender",
        +      "dob",
        +      "dob_granularity",
        +      "dob_city",
        +      "dob_state",
        +      "dod",
        +      "dod_granularity",
        +      "fjc_id",
        +      "aba_ratings",
        +      "political_affiliations",
        +      "education",
        +      "positions",
        +      "positionsShown",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Person ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "person_id",
        -  "name",
        -  "gender",
        -  "dob",
        -  "dob_granularity",
        -  "dob_city",
        -  "dob_state",
        -  "dod",
        -  "dod_granularity",
        -  "fjc_id",
        -  "aba_ratings",
        -  "political_affiliations",
        -  "education",
        -  "positions",
        -  "positionsShown",
        -  "truncated"
        -]
    • Changedcourtlistener_get_opinion6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cluster_id",
        +      "case_name",
        +      "case_name_full",
        +      "court",
        +      "court_id",
        +      "date_filed",
        +      "docket_id",
        +      "docket_number",
        +      "judges",
        +      "citations",
        +      "cite_count",
        +      "precedential_status",
        +      "syllabus",
        +      "posture",
        +      "kind"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Cluster ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. `unknown_section`: A requested sections name matches no opinion variant in this cluster. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited",
        +            "unknown_section"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cluster_id",
        -  "case_name",
        -  "case_name_full",
        -  "court",
        -  "court_id",
        -  "date_filed",
        -  "docket_id",
        -  "docket_number",
        -  "judges",
        -  "citations",
        -  "cite_count",
        -  "precedential_status",
        -  "syllabus",
        -  "posture",
        -  "kind"
        -]
    • Changedcourtlistener_get_oral_argument6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "kind"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Audio ID does not exist in CourtListener. `rate_limited`: 429 response from CourtListener. `unknown_section`: A requested sections name is not a field of the oral argument record. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited",
        +            "unknown_section"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "kind"
        -]
    • Changedcourtlistener_get_parties6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "docket_id",
        +      "total_parties",
        +      "next_cursor",
        +      "parties"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: Docket ID does not exist in CourtListener or has no RECAP party data. `rate_limited`: 429 response from CourtListener. Each call to this tool makes at least two upstream requests. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "docket_id",
        -  "total_parties",
        -  "next_cursor",
        -  "parties"
        -]
    • Changedcourtlistener_lookup_citation6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "matches",
        +      "queriedCitation"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `not_found`: CourtListener could not parse any citation out of the submitted text. A citation that parses but matches nothing is a result with status 404, not this error. `rate_limited`: 429 response from CourtListener. `empty_citation`: citation is empty or whitespace-only after trimming — no request is sent. `citation_too_long`: citation exceeds the 64000-character ceiling CourtListener accepts — no request is sent. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "not_found",
        +            "rate_limited",
        +            "empty_citation",
        +            "citation_too_long"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "matches",
        -  "queriedCitation"
        -]
    • Changedcourtlistener_lookup_courts6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "page",
        +      "next_cursor",
        +      "courts",
        +      "all_matching_court_ids",
        +      "all_matching_court_ids_complete",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "page",
        -  "next_cursor",
        -  "courts",
        -  "all_matching_court_ids",
        -  "all_matching_court_ids_complete",
        -  "totalCount"
        -]
    • Changedcourtlistener_search_dockets6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "next_cursor",
        +      "coverage_note",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited",
        +            "empty_query",
        +            "invalid_date"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "next_cursor",
        -  "coverage_note",
        -  "totalCount"
        -]
    • Changedcourtlistener_search_financial_disclosures6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "next_cursor"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "next_cursor"
        -]
    • Changedcourtlistener_search_judges6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "next_cursor",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited",
        +            "empty_query"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "next_cursor",
        -  "totalCount"
        -]
    • Changedcourtlistener_search_opinions6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "next_cursor",
        +      "totalCount",
        +      "effectiveQuery"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener — minute, hour, or day throttle hit. `invalid_query`: Query uses invalid field syntax or unsupported operators. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: filed_after or filed_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited",
        +            "invalid_query",
        +            "empty_query",
        +            "invalid_date"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "next_cursor",
        -  "totalCount",
        -  "effectiveQuery"
        -]
    • Changedcourtlistener_search_oral_arguments6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "next_cursor",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `rate_limited`: 429 response from CourtListener. `empty_query`: q is empty or whitespace-only after trimming — no request is sent. `invalid_date`: argued_after or argued_before is not a valid ISO 8601 calendar date. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "rate_limited",
        +            "empty_query",
        +            "invalid_date"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "next_cursor",
        -  "totalCount"
        -]
  5. 1 tool update
    • Changedcourtlistener_lookup_courts2 fields changed
      • changedInput schema / properties / jurisdiction / description
        Previous value: -"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 (historical), I=International, T=Territory, ST=State Trial, SS=State Supreme, SAG=State Attorney General, SAL=State Legislature, SA=State Appellate, S=State (other), TT=Tribal/Territory. Omit to list all."New value: +"Jurisdiction type — CourtListener's own court classification, one code per court: F=Federal Appellate, FD=Federal District, FB=Federal Bankruptcy, FBP=Federal Bankruptcy Panel, FS=Federal Special, S=State Supreme, SA=State Appellate, ST=State Trial, SS=State Special, SAG=State Attorney General, TRS=Tribal Supreme, TRA=Tribal Appellate, TRT=Tribal Trial, TRX=Tribal Special, TS=Territory Supreme, TA=Territory Appellate, TT=Territory Trial, TSP=Territory Special, MA=Military Appellate, MT=Military Trial, C=Committee, I=International. Omit to list all. SCOTUS and the numbered circuits are F; USITC and FISC are FS. Upstream's Testing code is not offered here: /courts/ excludes testing courts from every response, so a filter on it can only ever return nothing. Accepted but matching no court as of the 2026-07-30 snapshot: TSP, MT. Courts whose stored jurisdiction is not one of these codes (njcirctsussex, ohctapp1) are unreachable through this filter at any value — the value they store is not one the filter accepts. Pass those ids straight to the tool that needs them, or list with no jurisdiction filter."
      • changedInput schema / properties / jurisdiction / enum
        Previous value: -[
        -  "F",
        -  "FD",
        -  "FB",
        -  "FBP",
        -  "FS",
        -  "C",
        -  "I",
        -  "T",
        -  "ST",
        -  "SS",
        -  "SAG",
        -  "SAL",
        -  "SA",
        -  "S",
        -  "TT"
        -]New value: +[
        +  "F",
        +  "FD",
        +  "FB",
        +  "FBP",
        +  "FS",
        +  "S",
        +  "SA",
        +  "ST",
        +  "SS",
        +  "SAG",
        +  "TRS",
        +  "TRA",
        +  "TRT",
        +  "TRX",
        +  "TS",
        +  "TA",
        +  "TT",
        +  "TSP",
        +  "MA",
        +  "MT",
        +  "C",
        +  "I"
        +]
  6. 3 tool updates
    • Changedcourtlistener_get_judge5 fields changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present only when positions[] was truncated: what was withheld.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / positions / description
        Previous value: -"Every position on record, across all courts — judicial appointments plus non-judicial roles (private practice, prosecutor, professor), which carry no court and describe themselves in job_title."New value: +"Positions on record, across all courts — judicial appointments plus non-judicial roles (private practice, prosecutor, professor), which carry no court and describe themselves in job_title. CourtListener paginates this list and the walk is bounded, so read the truncated flag before treating it as a complete career."
      • addedOutput schema / properties / positionsShown
        Added value: +{
        +  "description": "Number of position records returned.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the bounded /positions/ page walk stopped with pages outstanding — positions[] is then a prefix of the person's record, not the whole of it. False when the walk reached the end.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "person_id",
        -  "name",
        -  "gender",
        -  "dob",
        -  "dob_granularity",
        -  "dob_city",
        -  "dob_state",
        -  "dod",
        -  "dod_granularity",
        -  "fjc_id",
        -  "aba_ratings",
        -  "political_affiliations",
        -  "education",
        -  "positions"
        -]New value: +[
        +  "person_id",
        +  "name",
        +  "gender",
        +  "dob",
        +  "dob_granularity",
        +  "dob_city",
        +  "dob_state",
        +  "dod",
        +  "dod_granularity",
        +  "fjc_id",
        +  "aba_ratings",
        +  "political_affiliations",
        +  "education",
        +  "positions",
        +  "positionsShown",
        +  "truncated"
        +]
    • Changedcourtlistener_lookup_citation5 fields changed
      • addedInput schema / properties / max_court_lookups
        Added value: +{
        +  "default": 4,
        +  "description": "How many distinct dockets this call may spend a request on to resolve cluster courts. The lookup itself is metered separately by CourtListener (per citation submitted), so this budget is drawn entirely from the ordinary per-request allowance — published free tier 5/min, 50/hour, 125/day, varying by token tier. 0 skips court resolution and costs nothing beyond the lookup; 20 is the ceiling. Clusters past the budget come back with court null and court_resolution \"over_budget\".",
        +  "maximum": 20,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / matches / items / properties / clusters / items / properties / court / description
        Previous value: -"Court display name. The citation-lookup payload carries no court, so this is resolved from the cluster's docket — one extra request each, capped at 4 distinct dockets per call. Null when that lookup was skipped past the cap, failed, or the cluster has no docket_id; the response notice reports how many clusters were left unresolved. Pass docket_id to courtlistener_get_docket, or cluster_id to courtlistener_get_opinion, to resolve one."New value: +"Court display name. The citation-lookup payload carries no court, so this is resolved from the cluster's docket — one extra request each, capped by max_court_lookups (default 4 distinct dockets per call). Null when that lookup was skipped past the budget, failed, or the cluster has no docket_id; court_resolution says which. Pass docket_id to courtlistener_get_docket, or cluster_id to courtlistener_get_opinion, to resolve one."
      • addedOutput schema / properties / matches / items / properties / clusters / items / properties / court_resolution
        Added value: +{
        +  "description": "Why court/court_id are or are not populated: \"resolved\" the docket lookup returned a court; \"no_docket\" the cluster carries no docket_id, so nothing can be resolved; \"lookup_failed\" a request was spent on the docket and it yielded no court; \"over_budget\" no request was spent because max_court_lookups ran out or the walk stopped on a rate limit — raise max_court_lookups or fetch that docket directly.",
        +  "enum": [
        +    "resolved",
        +    "no_docket",
        +    "lookup_failed",
        +    "over_budget"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / matches / items / properties / clusters / items / required
        Previous value: -[
        -  "cluster_id",
        -  "case_name",
        -  "court",
        -  "court_id",
        -  "date_filed",
        -  "docket_id",
        -  "citations",
        -  "cite_count",
        -  "precedential_status",
        -  "judges"
        -]New value: +[
        +  "cluster_id",
        +  "case_name",
        +  "court",
        +  "court_id",
        +  "court_resolution",
        +  "date_filed",
        +  "docket_id",
        +  "citations",
        +  "cite_count",
        +  "precedential_status",
        +  "judges"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Caveats on this result: a recovery hint when no citation in the input resolved to a case, and a count of clusters whose court the per-call docket cap left unresolved. Absent when neither applies."New value: +"Caveats on this result: a recovery hint when no citation in the input resolved to a case, and counts of the clusters whose court went unresolved — split by whether the per-call docket budget ran out or an attempted lookup returned nothing, since only the first is worth retrying with a larger budget. Absent when none applies."
    • Changedcourtlistener_lookup_courts4 fields changed
      • addedOutput schema / properties / all_matching_court_ids
        Added value: +{
        +  "description": "Every court id matching the same filters, from a snapshot of /courts/ bundled with this server (taken 2026-07-30) — the complete set, not just this page, and free of any request. Paging `courts` is only needed for the fields a court id alone does not carry (full_name, citation_string, scraper flags). Empty when more than 1000 courts match, since a prefix of the set would be indistinguishable from the whole of it — check all_matching_court_ids_complete before reading emptiness as \"no courts match\". A court added or retired upstream since the snapshot date appears in `courts` but may be missing here.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / all_matching_court_ids_complete
        Added value: +{
        +  "description": "True when all_matching_court_ids holds every matching court id. False when more than 1000 courts match: the list is withheld whole rather than truncated, and the notice gives the count and how to narrow.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / courts / description
        Previous value: -"Matching courts."New value: +"Matching courts on this page."
      • changedOutput schema / required
        Previous value: -[
        -  "page",
        -  "next_cursor",
        -  "courts",
        -  "totalCount"
        -]New value: +[
        +  "page",
        +  "next_cursor",
        +  "courts",
        +  "all_matching_court_ids",
        +  "all_matching_court_ids_complete",
        +  "totalCount"
        +]
  7. 4 tool updates
    • Changedcourtlistener_get_oral_argument6 fields changed
      • changedInput schema / properties / sections / description
        Previous value: -"Section identifiers to retrieve in full, from a prior outline response (e.g. [\"transcript\"]). Omit for the full record, or an outline if it overflows the inline budget."New value: +"Section identifiers to retrieve, from a prior outline response — [\"transcript\"] is the only one that adds anything, since every other field is returned regardless. A selection that omits \"transcript\" therefore returns the record without it. Omit this argument entirely for the whole record, or the record minus an oversized transcript."
      • changedOutput schema / properties / kind / description
        Previous value: -"'full' returns the record (or the selected sections); 'outline' lists retrievable sections when the transcript overflows the inline byte budget."New value: +"'full' carries the transcript inline; 'outline' withholds it and lists it as a retrievable section because it overflows the inline byte budget. Every other field of the record is present either way."
      • changedOutput schema / properties / retrieval_notice / description
        Previous value: -"How to re-call the tool for specific sections when the record overflows."New value: +"How to re-call the tool for the transcript when it overflows the inline budget."
      • changedOutput schema / properties / sections / description
        Previous value: -"Retrievable sections, largest first — pass names to `sections` on a re-call."New value: +"Sections withheld from this response — only ever `transcript`; pass its name to `sections` on a re-call. Absent when nothing was withheld."
      • changedOutput schema / properties / sections / items / description
        Previous value: -"A retrievable section of the record and its serialized byte size."New value: +"A withheld section of the record and its serialized byte size."
      • changedOutput schema / properties / transcript / description
        Previous value: -"Speech-to-text transcript; empty string if transcription has not completed."New value: +"Speech-to-text transcript; empty string if transcription has not completed. The only field an outline response withholds — re-call with sections:[\"transcript\"] to retrieve it."
    • Changedcourtlistener_get_parties7 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "Pagination cursor from a previous response's next_cursor field. Omit for the first page. This is an opaque token, not a page number — CourtListener cursor-paginates this endpoint, so a numeric value selects nothing and re-serves the first page.",
        +  "type": "string"
        +}
      • removedInput schema / properties / page
        Removed value: -{
        -  "default": 1,
        -  "description": "Page number (1-indexed). Use with page_size to paginate large party lists.",
        -  "maximum": 9007199254740991,
        -  "minimum": 1,
        -  "type": "integer"
        -}
      • changedOutput schema / properties / next_cursor / description
        Previous value: -"Next page number to pass as the `page` argument (this list is page-paginated); null when this is the last page."New value: +"Opaque pagination cursor for the next page — pass it back as the `cursor` argument; null when this is the last page."
      • removedOutput schema / properties / page
        Removed value: -{
        -  "description": "Current page number.",
        -  "type": "number"
        -}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total parties on this docket across all pages — present only when the API reports a numeric count (this endpoint returns it as a URL by default, so it is absent for any list spanning more than one page)."New value: +"Total parties on this docket across all pages — this endpoint reports its count as a URL rather than a number, so the total is only derivable when the first page is also the last, and is absent for any list spanning more than one page."
      • changedOutput schema / properties / total_parties / description
        Previous value: -"Total parties on this docket across all pages; null when upstream reports no count (a multi-page list whose total is unknown until the last page)."New value: +"Total parties on this docket across all pages; null when no total is derivable — CourtListener serves the count as a URL rather than a number here, so it is only known when the first page is also the last."
      • changedOutput schema / required
        Previous value: -[
        -  "docket_id",
        -  "total_parties",
        -  "page",
        -  "next_cursor",
        -  "parties"
        -]New value: +[
        +  "docket_id",
        +  "total_parties",
        +  "next_cursor",
        +  "parties"
        +]
    • Changedcourtlistener_lookup_citation10 fields changed
      • changedInput schema / properties / citation / description
        Previous value: -"Legal citation string to resolve (e.g., \"410 U.S. 113\", \"347 U.S. 483\", \"93 S. Ct. 705\"). Supports standard reporter formats."New value: +"Text to extract citations from — normally a single citation (e.g., \"410 U.S. 113\", \"347 U.S. 483\", \"93 S. Ct. 705\"), but any passage works and every citation in it is resolved. Supports standard reporter formats. Up to 64000 characters, which is CourtListener's own ceiling; a longer passage is rejected here rather than spending a request to be refused upstream."
      • removedOutput schema / properties / case_name
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Case name; null if not found."
        -}
      • removedOutput schema / properties / citations
        Removed value: -{
        -  "description": "All known citation strings for this case.",
        -  "items": {
        -    "type": "string"
        -  },
        -  "type": "array"
        -}
      • removedOutput schema / properties / cluster_id
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "number"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Opinion cluster ID — null if the citation is not in the CourtListener database."
        -}
      • removedOutput schema / properties / court
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Court display name; null if not found."
        -}
      • removedOutput schema / properties / date_filed
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Date the opinion was filed; null if not found."
        -}
      • addedOutput schema / properties / matches
        Added value: +{
        +  "description": "One entry per citation CourtListener extracted from the input, in the order they appear.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One citation found in the submitted text and everything it resolved to.",
        +    "properties": {
        +      "citation": {
        +        "description": "The citation as CourtListener matched it in the submitted text.",
        +        "type": "string"
        +      },
        +      "clusters": {
        +        "description": "Cases this citation resolved to — empty when status is not 200 or 300, and more than one when status is 300.",
        +        "items": {
        +          "additionalProperties": false,
        +          "description": "An opinion cluster this citation resolved to.",
        +          "properties": {
        +            "case_name": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Case name; null if not recorded."
        +            },
        +            "citations": {
        +              "description": "All known citation strings for this case.",
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "cite_count": {
        +              "anyOf": [
        +                {
        +                  "type": "number"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Times other opinions cite this case — a rough authority weight. Null if not recorded."
        +            },
        +            "cluster_id": {
        +              "anyOf": [
        +                {
        +                  "type": "number"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Opinion cluster ID — pass to courtlistener_get_opinion. Null when upstream sent no ID."
        +            },
        +            "court": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Court display name. The citation-lookup payload carries no court, so this is resolved from the cluster's docket — one extra request each, capped at 4 distinct dockets per call. Null when that lookup was skipped past the cap, failed, or the cluster has no docket_id; the response notice reports how many clusters were left unresolved. Pass docket_id to courtlistener_get_docket, or cluster_id to courtlistener_get_opinion, to resolve one."
        +            },
        +            "court_id": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Court identifier for the `court` filter on the search tools (e.g. \"scotus\"); null under the same conditions as `court`."
        +            },
        +            "date_filed": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Date the opinion was filed; null if not recorded."
        +            },
        +            "docket_id": {
        +              "anyOf": [
        +                {
        +                  "type": "number"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Linked docket — pass to courtlistener_get_docket. Null if not recorded."
        +            },
        +            "judges": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Free-text judge names; null or empty if not recorded."
        +            },
        +            "precedential_status": {
        +              "anyOf": [
        +                {
        +                  "type": "string"
        +                },
        +                {
        +                  "type": "null"
        +                }
        +              ],
        +              "description": "Publication status (e.g. \"Published\", \"Unpublished\"); null if not recorded."
        +            }
        +          },
        +          "required": [
        +            "cluster_id",
        +            "case_name",
        +            "court",
        +            "court_id",
        +            "date_filed",
        +            "docket_id",
        +            "citations",
        +            "cite_count",
        +            "precedential_status",
        +            "judges"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "error_message": {
        +        "description": "CourtListener's explanation when status is not 200; empty string otherwise.",
        +        "type": "string"
        +      },
        +      "normalized_citation": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Canonical citation form used by CourtListener; null if not resolved."
        +      },
        +      "status": {
        +        "description": "Resolution status for this citation alone: 200 one case, 300 several candidates, 400 unrecognized reporter, 404 no case found, 429 past the per-request citation cap. Not the status of the request, which succeeded.",
        +        "type": "number"
        +      },
        +      "status_label": {
        +        "description": "status decoded to a label.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "citation",
        +      "normalized_citation",
        +      "status",
        +      "status_label",
        +      "error_message",
        +      "clusters"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / normalized_citation
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "description": "Canonical citation form used by CourtListener; null if not resolved."
        -}
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery hint when the citation is not in the database — suggests alternative lookup strategies."New value: +"Caveats on this result: a recovery hint when no citation in the input resolved to a case, and a count of clusters whose court the per-call docket cap left unresolved. Absent when neither applies."
      • changedOutput schema / required
        Previous value: -[
        -  "cluster_id",
        -  "case_name",
        -  "court",
        -  "date_filed",
        -  "citations",
        -  "normalized_citation",
        -  "queriedCitation"
        -]New value: +[
        +  "matches",
        +  "queriedCitation"
        +]
    • Changedcourtlistener_lookup_courts4 fields changed
      • removedInput schema / properties / in_use
        Removed value: -{
        -  "default": true,
        -  "description": "When true (default), only return courts currently scraped by CourtListener. Set to false to include historical or inactive courts.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / page / description
        Previous value: -"Page number (1-indexed). CourtListener caps /courts/ at ~20 rows per page regardless of size, so the full list (~472 courts) spans ~24 pages — pass the next_cursor from a previous response here to page through them."New value: +"Page number (1-indexed). CourtListener serves /courts/ at a fixed 20 rows per page and ignores any requested page size, so the number of pages is the enrichment totalCount divided by 20 — there is no way to pull a larger page. Pass the next_cursor from a previous response here to walk them one call at a time."
      • addedInput schema / properties / status
        Added value: +{
        +  "default": "active",
        +  "description": "Which bench to return. 'active' (default) returns only courts CourtListener currently scrapes; 'inactive' returns only the historical and defunct courts it no longer scrapes; 'any' returns both. The two filtered sets are disjoint, so 'any' is the only value that reaches the whole list — but reaching all of it means paging, one call per 20 courts, and the inactive bench is several times larger than the active one. Prefer the narrowest value that answers the question, and narrow with jurisdiction rather than paging the full list.",
        +  "enum": [
        +    "active",
        +    "inactive",
        +    "any"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / next_cursor / description
        Previous value: -"Next page number to pass as the `page` argument (this list is page-paginated at ~20 rows/page); null when this is the last page."New value: +"Next page number to pass as the `page` argument (this list is page-paginated at a fixed 20 rows/page); null when this is the last page — a non-null value means the courts shown are a partial view of the filtered set."
  8. 2 tool updates
    • Changedcourtlistener_get_judge21 fields changed
      • changedOutput schema / properties / dob / description
        Previous value: -"Date of birth; null if not recorded."New value: +"Date of birth as CourtListener stores it, always full ISO 8601 — but the month and day are placeholders unless dob_granularity is \"day\". Read dob_granularity before presenting this as an exact date. Null if not recorded."
      • addedOutput schema / properties / dob_granularity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Precision actually recorded for dob: \"year\", \"month\", or \"day\". Null when CourtListener recorded no precision. An unrecognized upstream value passes through unchanged."
        +}
      • changedOutput schema / properties / dod / description
        Previous value: -"Date of death; null if living or not recorded."New value: +"Date of death as CourtListener stores it, always full ISO 8601 — precision qualified by dod_granularity, as with dob. Null if living or not recorded."
      • addedOutput schema / properties / dod_granularity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Precision actually recorded for dod: \"year\", \"month\", or \"day\". Null when CourtListener recorded no precision."
        +}
      • changedOutput schema / properties / education / items / properties / degree / description
        Previous value: -"Degree level; null if not recorded."New value: +"Raw CourtListener degree-level code (e.g. \"ba\"); null if not recorded."
      • addedOutput schema / properties / education / items / properties / degree_label
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Degree level expanded to a readable label (e.g. \"Juris Doctor (J.D.)\"). An unmapped code passes through as the code itself; null if not recorded."
        +}
      • changedOutput schema / properties / education / items / required
        Previous value: -[
        -  "school",
        -  "degree",
        -  "year"
        -]New value: +[
        +  "school",
        +  "degree",
        +  "degree_label",
        +  "year"
        +]
      • changedOutput schema / properties / positions / description
        Previous value: -"All judicial positions held, across all courts."New value: +"Every position on record, across all courts — judicial appointments plus non-judicial roles (private practice, prosecutor, professor), which carry no court and describe themselves in job_title."
      • changedOutput schema / properties / positions / items / description
        Previous value: -"Judicial position record."New value: +"Position record — judicial or otherwise."
      • changedOutput schema / properties / positions / items / properties / date_start / description
        Previous value: -"Date position started; null if not recorded."New value: +"Date the position started as CourtListener stores it, always full ISO 8601 — the month and day are placeholders unless date_start_granularity is \"day\". Null if not recorded."
      • addedOutput schema / properties / positions / items / properties / date_start_granularity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Precision actually recorded for date_start: \"year\", \"month\", or \"day\". Null when CourtListener recorded no precision."
        +}
      • changedOutput schema / properties / positions / items / properties / date_termination / description
        Previous value: -"Date position ended; null if current."New value: +"Date the position ended as CourtListener stores it, always full ISO 8601 — precision qualified by date_termination_granularity. Null if current."
      • addedOutput schema / properties / positions / items / properties / date_termination_granularity
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Precision actually recorded for date_termination: \"year\", \"month\", or \"day\". Null when CourtListener recorded no precision."
        +}
      • addedOutput schema / properties / positions / items / properties / job_title
        Added value: +{
        +  "description": "Free-text title for a role with no position_type code (e.g. \"Assistant district attorney\"); empty on judicial rows.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / positions / items / properties / organization_name
        Added value: +{
        +  "description": "Employer for a non-judicial role; empty on judicial rows, which use court.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / positions / items / properties / position_type / description
        Previous value: -"Position title (e.g., \"District Judge\", \"Circuit Judge\", \"Justice\")."New value: +"Raw CourtListener position-type code (e.g. \"jud\", \"c-jud\") — the value the /positions/ position_type filter takes. Empty for non-judicial roles, which describe themselves in job_title."
      • addedOutput schema / properties / positions / items / properties / position_type_label
        Added value: +{
        +  "description": "Position type expanded to a readable label (e.g. \"Judge\", \"Chief Judge\"). An unmapped code passes through as the code itself; empty for non-judicial roles.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / positions / items / properties / termination_reason / description
        Previous value: -"Reason for termination; null if still serving."New value: +"Raw CourtListener termination-reason code (e.g. \"other_pos\"); null if still serving."
      • addedOutput schema / properties / positions / items / properties / termination_reason_label
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Termination reason expanded to a readable label (e.g. \"Appointed to Other Judgeship\"). An unmapped code passes through as the code itself; null if still serving."
        +}
      • changedOutput schema / properties / positions / items / required
        Previous value: -[
        -  "court",
        -  "court_id",
        -  "position_type",
        -  "appointer",
        -  "nomination_process",
        -  "date_nominated",
        -  "date_confirmation",
        -  "date_start",
        -  "date_termination",
        -  "termination_reason"
        -]New value: +[
        +  "court",
        +  "court_id",
        +  "position_type",
        +  "position_type_label",
        +  "job_title",
        +  "organization_name",
        +  "appointer",
        +  "nomination_process",
        +  "date_nominated",
        +  "date_confirmation",
        +  "date_start",
        +  "date_start_granularity",
        +  "date_termination",
        +  "date_termination_granularity",
        +  "termination_reason",
        +  "termination_reason_label"
        +]
      • changedOutput schema / required
        Previous value: -[
        -  "person_id",
        -  "name",
        -  "gender",
        -  "dob",
        -  "dob_city",
        -  "dob_state",
        -  "dod",
        -  "fjc_id",
        -  "aba_ratings",
        -  "political_affiliations",
        -  "education",
        -  "positions"
        -]New value: +[
        +  "person_id",
        +  "name",
        +  "gender",
        +  "dob",
        +  "dob_granularity",
        +  "dob_city",
        +  "dob_state",
        +  "dod",
        +  "dod_granularity",
        +  "fjc_id",
        +  "aba_ratings",
        +  "political_affiliations",
        +  "education",
        +  "positions"
        +]
    • Changedcourtlistener_get_opinion3 fields changed
      • changedOutput schema / properties / opinions / items / properties / type / description
        Previous value: -"Opinion type: \"lead-opinion\", \"concurrence\", \"dissent\", \"combined-opinion\", etc."New value: +"Raw CourtListener opinion-type code (e.g. \"030concurrence\"); the numeric prefix is a sort key, not part of the type. Empty when upstream recorded none."
      • addedOutput schema / properties / opinions / items / properties / type_label
        Added value: +{
        +  "description": "Opinion type expanded to the label courtlistener_search_opinions serves for the same variant: \"lead-opinion\", \"concurrence-opinion\", \"dissent\", \"combined-opinion\", etc. An unmapped code passes through as the code itself.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / opinions / items / required
        Previous value: -[
        -  "id",
        -  "type",
        -  "author_id",
        -  "per_curiam",
        -  "html_text",
        -  "plain_text",
        -  "cites",
        -  "download_url"
        -]New value: +[
        +  "id",
        +  "type",
        +  "type_label",
        +  "author_id",
        +  "per_curiam",
        +  "html_text",
        +  "plain_text",
        +  "cites",
        +  "download_url"
        +]
  9. 1 tool update
    • Changedcourtlistener_get_citations3 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results to request (default 20). For direction=\"cited_by\", CourtListener enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 results. direction=\"citing\" returns at most page_size (the cited-opinion list is sliced before querying) — fewer when the opinion cites fewer than page_size distinct opinions. Each citation tool call costs one request against the rate limit — keep low for multi-hop traversal."New value: +"Number of results to request (default 20). For direction=\"cited_by\", CourtListener enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 results. direction=\"citing\" returns at most page_size (the cited-opinion list is sliced before querying) — fewer when the opinion cites fewer than page_size distinct opinions. Either direction costs three requests against the rate limit (a case with many opinion variants costs one more per extra variant page) — keep low for multi-hop traversal."
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery hint when no citations are found — echoes direction and filters, suggests alternatives."New value: +"Context when no citations are returned — either that this page had no match under the filters and more pages remain, or a recovery hint echoing direction and filters."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total citations in the requested direction."New value: +"Total citations in the requested direction. For \"cited_by\" it counts matching clusters with the court and filed_after filters applied. For \"citing\" it counts the distinct opinions this case cites, before any filter — so it exceeds what the filters make reachable, and runs higher than the result rows, which are clusters (several cited opinions in one case collapse to one row)."
  10. 1 tool update
    • Changedcourtlistener_get_parties9 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"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."New value: +"Requested number of parties per page (1–10). CourtListener paginates this endpoint at a fixed size and does not honor the requested value, so a page can come back larger than asked for."
      • addedOutput schema / properties / parties / items / properties / attorneys / items / properties / date_action
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Date the attorney–party relationship ended; null while the attorney is still of record."
        +}
      • addedOutput schema / properties / parties / items / properties / attorneys / items / properties / role
        Added value: +{
        +  "description": "role_code decoded to a label (e.g., \"Lead attorney\"). Codes 5–9 (\"Self-terminated\" through \"Disbarred\") mean the attorney is no longer of record. The stringified code when upstream sends a value outside the documented enum, \"Unrecorded\" when it sends none.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / parties / items / properties / attorneys / items / properties / role_code / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / parties / items / properties / attorneys / items / properties / role_code / description
        Previous value: -"Numeric attorney role code from the party–attorney relationship (e.g., 1 = Lead attorney)."New value: +"Numeric attorney role code from the party–attorney relationship (1 = Attorney to be noticed, 2 = Lead attorney, 3 = Attorney in sealed group, 4 = Pro hac vice, 5 = Self-terminated, 6 = Terminated, 7 = Suspended, 8 = Inactive, 9 = Disbarred, 10 = Unknown); null when upstream recorded no code."
      • removedOutput schema / properties / parties / items / properties / attorneys / items / properties / role_code / type
        Removed value: -"number"
      • changedOutput schema / properties / parties / items / properties / attorneys / items / required
        Previous value: -[
        -  "attorney_id",
        -  "name",
        -  "contact_raw",
        -  "role_code"
        -]New value: +[
        +  "attorney_id",
        +  "name",
        +  "contact_raw",
        +  "role_code",
        +  "role",
        +  "date_action"
        +]
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total parties on this docket across all pages."New value: +"Total parties on this docket across all pages — present only when the API reports a numeric count (this endpoint returns it as a URL by default, so it is absent for any list spanning more than one page)."
      • changedOutput schema / required
        Previous value: -[
        -  "docket_id",
        -  "total_parties",
        -  "page",
        -  "next_cursor",
        -  "parties",
        -  "totalCount"
        -]New value: +[
        +  "docket_id",
        +  "total_parties",
        +  "page",
        +  "next_cursor",
        +  "parties"
        +]
  11. 5 tool updates
    • Changedcourtlistener_get_citations1 field changed
      • changedOutput schema / properties / results / items / properties / snippet / description
        Previous value: -"Text excerpt showing context around the citation (where available)."New value: +"Matched text excerpt from the related opinion, taken from the first opinion variant in the cluster that carries one; empty string when none does. It is a relevance preview for the cluster, not necessarily text surrounding the citation itself."
    • Changedcourtlistener_search_dockets15 fields changed
      • addedOutput schema / properties / results / items / properties / attorneys
        Added value: +{
        +  "description": "Attorney names of record on this docket; empty when none are recorded.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / results / items / properties / case_name_full
        Added value: +{
        +  "description": "Full case name with all parties; empty string when not recorded.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / results / items / properties / document_count
        Removed value: -{
        -  "description": "Number of documents available in RECAP.",
        -  "type": "number"
        -}
      • addedOutput schema / properties / results / items / properties / firms
        Added value: +{
        +  "description": "Law firm names of record on this docket; empty when none are recorded.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / results / items / properties / jurisdiction_type
        Added value: +{
        +  "description": "Basis of federal jurisdiction (e.g. \"Federal Question\"); empty string when not recorded.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / referred_to
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Referred magistrate judge name; null if not recorded."
        +}
      • changedOutput schema / properties / results / items / properties / sample_documents / description
        Previous value: -"Up to 3 sample filings from this docket."New value: +"Up to 3 sample filings matched on this docket — a search excerpt, not the docket's full filing list. Call courtlistener_get_docket for every entry."
      • changedOutput schema / properties / results / items / properties / sample_documents / items / properties / date_filed / description
        Previous value: -"Date the document was filed."New value: +"Date the parent docket entry was filed; empty string when not recorded."
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / document_type
        Added value: +{
        +  "description": "Document classification (e.g. \"PACER Document\", \"RECAP Document\"); empty string when not recorded.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / entry_number
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Docket entry number this document belongs to; null if unnumbered."
        +}
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / filepath_local
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Fully-qualified RECAP storage URL (https://storage.courtlistener.com/...) for the document; null when no copy is stored."
        +}
      • addedOutput schema / properties / results / items / properties / sample_documents / items / properties / page_count
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Page count; null if not recorded."
        +}
      • changedOutput schema / properties / results / items / properties / sample_documents / items / required
        Previous value: -[
        -  "id",
        -  "description",
        -  "date_filed",
        -  "document_number",
        -  "is_available"
        -]New value: +[
        +  "id",
        +  "description",
        +  "date_filed",
        +  "document_number",
        +  "entry_number",
        +  "document_type",
        +  "page_count",
        +  "filepath_local",
        +  "is_available"
        +]
      • addedOutput schema / properties / results / items / properties / suit_nature
        Added value: +{
        +  "description": "Nature-of-suit label, usually prefixed with its PACER code (e.g. \"830 Patent\"); empty string when not recorded.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "docket_id",
        -  "case_name",
        -  "court",
        -  "court_id",
        -  "date_filed",
        -  "date_terminated",
        -  "docket_number",
        -  "pacer_case_id",
        -  "assigned_to",
        -  "cause",
        -  "jury_demand",
        -  "parties",
        -  "document_count",
        -  "sample_documents"
        -]New value: +[
        +  "docket_id",
        +  "case_name",
        +  "case_name_full",
        +  "court",
        +  "court_id",
        +  "date_filed",
        +  "date_terminated",
        +  "docket_number",
        +  "pacer_case_id",
        +  "assigned_to",
        +  "referred_to",
        +  "cause",
        +  "jury_demand",
        +  "suit_nature",
        +  "jurisdiction_type",
        +  "parties",
        +  "attorneys",
        +  "firms",
        +  "sample_documents"
        +]
    • Changedcourtlistener_search_judges4 fields changed
      • changedOutput schema / properties / results / items / properties / aba_rating / description
        Previous value: -"ABA qualification ratings."New value: +"ABA qualification labels (e.g. \"Well Qualified\", \"Qualified\"), one per rating on record — not the rating codes."
      • changedOutput schema / properties / results / items / properties / current_position / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "appointer": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Appointing president; null if elected or not recorded."
        -      },
        -      "court": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Court where currently serving; null if not applicable."
        -      },
        -      "court_id": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Court identifier."
        -      },
        -      "date_start": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Date position started."
        -      },
        -      "position_type": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "description": "Position title (e.g., \"District Judge\")."
        -      }
        -    },
        -    "required": [
        -      "court",
        -      "court_id",
        -      "position_type",
        -      "appointer",
        -      "date_start"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "appointer": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Name of the appointing president (e.g. \"Obama, Barack Hussein, II\"); null if elected or not recorded."
        +      },
        +      "court": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Court full name; null for non-judicial positions."
        +      },
        +      "court_id": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Court identifier for use in filter parameters; null for non-judicial positions."
        +      },
        +      "date_start": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Date the position started; null if not recorded."
        +      },
        +      "date_termination": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Date the position ended; null while the judge still holds it."
        +      },
        +      "job_title": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Free-text title for non-judicial roles (e.g. \"Assistant district attorney\"); null for judicial positions."
        +      },
        +      "organization_name": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Employer for non-judicial roles; null for judicial positions."
        +      },
        +      "position_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Judicial position title (e.g. \"Judge\", \"Chief Judge\"); null for non-judicial positions — see job_title."
        +      },
        +      "selection_method": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "How the judge reached the position (e.g. \"Appointment (President)\", \"Election (Partisan)\"); null if not recorded."
        +      },
        +      "termination_reason": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Why the position ended (e.g. \"Appointed to Other Judgeship\", \"Retirement\"); null while still serving."
        +      }
        +    },
        +    "required": [
        +      "court",
        +      "court_id",
        +      "position_type",
        +      "job_title",
        +      "organization_name",
        +      "appointer",
        +      "selection_method",
        +      "date_start",
        +      "date_termination",
        +      "termination_reason"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / results / items / properties / current_position / description
        Previous value: -"Current or most recent position; null if not available."New value: +"The position with no termination date, or — when several or none qualify — the one with the latest start date. Null when the record carries no positions. courtlistener_get_judge returns the full appointment history."
      • changedOutput schema / properties / results / items / properties / political_affiliation / description
        Previous value: -"Political affiliation codes."New value: +"Party labels (e.g. \"Democratic\", \"Republican\"), one per recorded affiliation — not the single-letter codes the political_affiliation input filter takes."
    • Changedcourtlistener_search_opinions3 fields changed
      • addedOutput schema / properties / results / items / properties / opinions
        Added value: +{
        +  "description": "Opinion variants filed in this case (majority, concurrence, dissent, per curiam). Empty when upstream returned none.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One opinion variant within the cluster.",
        +    "properties": {
        +      "author_id": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Person ID of the authoring judge — pass to courtlistener_get_judge; null when unattributed."
        +      },
        +      "cites": {
        +        "description": "Opinion IDs this variant cites. These are opinion-level IDs, not cluster IDs — courtlistener_get_opinion and courtlistener_get_citations both take a cluster_id, so do not pass these values to them directly.",
        +        "items": {
        +          "type": "number"
        +        },
        +        "type": "array"
        +      },
        +      "download_url": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "URL of the originating court's copy; null when none was recorded. Often plain HTTP and prone to rot — prefer local_path."
        +      },
        +      "id": {
        +        "description": "Opinion ID for this variant — identifies one opinion within the cluster (the cluster itself is cluster_id).",
        +        "type": "number"
        +      },
        +      "local_path": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "CourtListener-hosted copy of the source document (https://storage.courtlistener.com/...); null if not stored."
        +      },
        +      "per_curiam": {
        +        "description": "True when the opinion was issued per curiam (by the court).",
        +        "type": "boolean"
        +      },
        +      "type": {
        +        "description": "Variant type as an expanded label (e.g. \"combined-opinion\", \"lead-opinion\", \"dissent\").",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "type",
        +      "author_id",
        +      "per_curiam",
        +      "download_url",
        +      "local_path",
        +      "cites"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / results / items / properties / snippet / description
        Previous value: -"Matched text excerpt from the opinion."New value: +"Matched text excerpt, taken from the first entry in opinions[] that carries one; empty string when no variant has an excerpt. CourtListener does not mark which variant the search matched, so treat this as a relevance preview for the cluster, not as an excerpt attributable to a specific opinion — read opinions[] to attribute it."
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "cluster_id",
        -  "case_name",
        -  "case_name_full",
        -  "court",
        -  "court_id",
        -  "date_filed",
        -  "docket_number",
        -  "docket_id",
        -  "citations",
        -  "cite_count",
        -  "judges",
        -  "status",
        -  "snippet"
        -]New value: +[
        +  "cluster_id",
        +  "case_name",
        +  "case_name_full",
        +  "court",
        +  "court_id",
        +  "date_filed",
        +  "docket_number",
        +  "docket_id",
        +  "citations",
        +  "cite_count",
        +  "judges",
        +  "status",
        +  "snippet",
        +  "opinions"
        +]
    • Changedcourtlistener_search_oral_arguments2 fields changed
      • changedOutput schema / properties / results / items / properties / download_url / description
        Previous value: -"Direct MP3 download URL; null if not available."New value: +"MP3 URL at the originating court; null if not recorded. Often plain HTTP and prone to rot as courts reorganize — prefer local_path, CourtListener's durable copy."
      • changedOutput schema / properties / results / items / properties / local_path / description
        Previous value: -"Local storage path on CourtListener servers; null if not available."New value: +"CourtListener-hosted copy of the recording (https://storage.courtlistener.com/...); null if not stored."
  12. 2 tool updates
    • Changedcourtlistener_lookup_courts4 fields changed
      • addedInput schema / properties / page
        Added value: +{
        +  "default": 1,
        +  "description": "Page number (1-indexed). CourtListener caps /courts/ at ~20 rows per page regardless of size, so the full list (~472 courts) spans ~24 pages — pass the next_cursor from a previous response here to page through them.",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Next page number to pass as the `page` argument (this list is page-paginated at ~20 rows/page); null when this is the last page."
        +}
      • addedOutput schema / properties / page
        Added value: +{
        +  "description": "Current page number (1-indexed).",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "courts",
        -  "totalCount"
        -]New value: +[
        +  "page",
        +  "next_cursor",
        +  "courts",
        +  "totalCount"
        +]
    • Changedcourtlistener_search_financial_disclosures1 field changed
      • changedInput schema / properties / year / description
        Previous value: -"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."New value: +"Filing year to filter by (e.g., 2022). Applied client-side to the fetched page only — CourtListener rejects a server-side year param, so filings for this year on later pages are not included. When a page has no match for the year but more pages remain, next_cursor is returned; pass it as cursor to check the next page. Omit to return all years on the page."
  13. 5 tool updates
    • Changedcourtlistener_lookup_citation1 field changed
      • removedInput schema / properties / citation / minLength
        Removed value: -1
    • Changedcourtlistener_search_dockets1 field changed
      • removedInput schema / properties / q / minLength
        Removed value: -1
    • Changedcourtlistener_search_judges1 field changed
      • removedInput schema / properties / q / minLength
        Removed value: -1
    • Changedcourtlistener_search_opinions1 field changed
      • removedInput schema / properties / q / minLength
        Removed value: -1
    • Changedcourtlistener_search_oral_arguments1 field changed
      • removedInput schema / properties / q / minLength
        Removed value: -1
  14. 1 tool update
    • Addedcourtlistener_get_financial_disclosure
  15. 3 tool updates
    • Changedcourtlistener_get_citations2 fields changed
      • changedInput schema / properties / page_size / default
        Previous value: -10New value: +20
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results (1–20). Each citation tool call costs one request against the rate limit — keep page_size low for multi-hop traversal."New value: +"Number of results to request (default 20). For direction=\"cited_by\", CourtListener enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 results. direction=\"citing\" returns at most page_size (the cited-opinion list is sliced before querying) — fewer when the opinion cites fewer than page_size distinct opinions. Each citation tool call costs one request against the rate limit — keep low for multi-hop traversal."
    • Changedcourtlistener_get_docket6 fields changed
      • addedInput schema / properties / entries_page
        Added value: +{
        +  "default": 1,
        +  "description": "Page of docket entries to fetch (1-indexed). Docket entries are page-paginated at 20 per page; pass the next_cursor from a previous response here to page through large cases.",
        +  "maximum": 9007199254740991,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / entries_page_size / description
        Previous value: -"Number of docket entries to return (1–50). Large cases can have hundreds of entries."New value: +"Requested docket entries per page. NOTE: CourtListener ignores this value — /docket-entries/ always returns a fixed 20-entry page regardless of what is passed. Use entries_page to reach entries beyond the first 20 (large cases can have hundreds)."
      • changedOutput schema / properties / entries / description
        Previous value: -"Docket entries up to entries_page_size."New value: +"Docket entries for this page (fixed at 20 per page; entries_page_size is not honored by upstream)."
      • addedOutput schema / properties / entries_page
        Added value: +{
        +  "description": "Current entries page number (1-indexed).",
        +  "type": "number"
        +}
      • addedOutput schema / properties / next_cursor
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Next page number to pass as the `entries_page` argument (docket entries are page-paginated); null when this is the last page."
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "docket_id",
        -  "case_name",
        -  "case_name_full",
        -  "court",
        -  "court_id",
        -  "date_filed",
        -  "date_terminated",
        -  "docket_number",
        -  "pacer_case_id",
        -  "assigned_to",
        -  "referred_to",
        -  "cause",
        -  "jury_demand",
        -  "jurisdiction_type",
        -  "total_entries",
        -  "entries"
        -]New value: +[
        +  "docket_id",
        +  "case_name",
        +  "case_name_full",
        +  "court",
        +  "court_id",
        +  "date_filed",
        +  "date_terminated",
        +  "docket_number",
        +  "pacer_case_id",
        +  "assigned_to",
        +  "referred_to",
        +  "cause",
        +  "jury_demand",
        +  "jurisdiction_type",
        +  "total_entries",
        +  "entries_page",
        +  "next_cursor",
        +  "entries"
        +]
    • Changedcourtlistener_search_financial_disclosures1 field changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of filings to return (1–20)."New value: +"Number of filings to request (default 20). CourtListener enforces a minimum of 20 results per page regardless of the value passed — you will always receive at least 20 filings."
  16. 2 tool updates
    • Changedcourtlistener_get_opinion6 fields changed
      • addedInput schema / properties / sections
        Added value: +{
        +  "description": "Opinion variant identifiers to retrieve in full, from a prior outline response (e.g. [\"opinion_12345\"]). Omit to return all variants, or an outline if they overflow the inline byte budget.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / kind
        Added value: +{
        +  "description": "'full' returns the opinion variants (all, or a selected subset); 'outline' lists each variant as a retrievable section (opinion_<id>) when the opinions overflow the inline byte budget. Cluster metadata is present either way.",
        +  "enum": [
        +    "full",
        +    "outline"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / opinions / description
        Previous value: -"All opinion variants within this cluster."New value: +"All opinion variants within this cluster. Present in full mode; omitted in outline mode — re-call with sections:[\"opinion_<id>\"] to retrieve specific variants."
      • addedOutput schema / properties / retrieval_notice
        Added value: +{
        +  "description": "How to re-call the tool for specific opinion variants when the opinions overflow.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / sections
        Added value: +{
        +  "description": "Retrievable opinion variants, largest first — pass names to `sections` on a re-call.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A retrievable opinion variant (opinion_<id>) and its serialized byte size.",
        +    "properties": {
        +      "bytes": {
        +        "description": "Serialized byte size of the section",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "name": {
        +        "description": "Section identifier — pass in `sections` to retrieve it",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "bytes"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "cluster_id",
        -  "case_name",
        -  "case_name_full",
        -  "court",
        -  "court_id",
        -  "date_filed",
        -  "docket_id",
        -  "docket_number",
        -  "judges",
        -  "citations",
        -  "cite_count",
        -  "precedential_status",
        -  "syllabus",
        -  "posture",
        -  "opinions"
        -]New value: +[
        +  "cluster_id",
        +  "case_name",
        +  "case_name_full",
        +  "court",
        +  "court_id",
        +  "date_filed",
        +  "docket_id",
        +  "docket_number",
        +  "judges",
        +  "citations",
        +  "cite_count",
        +  "precedential_status",
        +  "syllabus",
        +  "posture",
        +  "kind"
        +]
    • Changedcourtlistener_get_oral_argument5 fields changed
      • addedInput schema / properties / sections
        Added value: +{
        +  "description": "Section identifiers to retrieve in full, from a prior outline response (e.g. [\"transcript\"]). Omit for the full record, or an outline if it overflows the inline budget.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / kind
        Added value: +{
        +  "description": "'full' returns the record (or the selected sections); 'outline' lists retrievable sections when the transcript overflows the inline byte budget.",
        +  "enum": [
        +    "full",
        +    "outline"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / retrieval_notice
        Added value: +{
        +  "description": "How to re-call the tool for specific sections when the record overflows.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / sections
        Added value: +{
        +  "description": "Retrievable sections, largest first — pass names to `sections` on a re-call.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A retrievable section of the record and its serialized byte size.",
        +    "properties": {
        +      "bytes": {
        +        "description": "Serialized byte size of the section",
        +        "maximum": 9007199254740991,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "name": {
        +        "description": "Section identifier — pass in `sections` to retrieve it",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "name",
        +      "bytes"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "oral_argument_id",
        -  "case_name",
        -  "case_name_full",
        -  "docket_id",
        -  "duration_seconds",
        -  "download_url",
        -  "judges",
        -  "panel_ids",
        -  "has_transcript",
        -  "transcript"
        -]New value: +[
        +  "kind"
        +]
  17. 2 tool updates
    • Changedcourtlistener_get_judge2 fields changed
      • changedOutput schema / properties / positions / items / properties / appointer / description
        Previous value: -"Appointing president name; null if elected or not recorded."New value: +"Position URI of the appointing authority (e.g., \".../positions/123/\"), not resolved to a name; null if elected or not recorded."
      • changedOutput schema / properties / positions / items / properties / nomination_process / description
        Previous value: -"Nomination process; null if not recorded."New value: +"Selection method, expanded to a readable label (e.g., \"Appointment (President)\"); null if not recorded."
    • Changedcourtlistener_get_opinion1 field changed
      • changedOutput schema / properties / opinions / items / properties / html_text / description
        Previous value: -"Full opinion text as HTML; may be empty if only a download URL is available."New value: +"Full opinion text as HTML, drawn from the best available variant (citation-linked when present); empty only when no HTML text is stored — use download_url then."
  18. 2 tool updates
    • Changedcourtlistener_get_docket3 fields changed
      • changedOutput schema / properties / entries / items / properties / documents / items / properties / document_number / anyOf
        Previous value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / entries / items / properties / documents / items / properties / document_number / description
        Previous value: -"PACER document number; null if not assigned."New value: +"PACER document number as a string (e.g. \"1\"); attachments can be non-integer like \"70-1\". Null if not assigned."
      • changedOutput schema / properties / entries / items / properties / documents / items / properties / filepath_local / description
        Previous value: -"RECAP storage URL for available documents; null if not available."New value: +"Fully-qualified RECAP storage URL (https://storage.courtlistener.com/...) for the document; null if not available."
    • Changedcourtlistener_get_parties4 fields changed
      • changedOutput schema / properties / next_cursor / description
        Previous value: -"Opaque cursor for the next page; null when this is the last page."New value: +"Next page number to pass as the `page` argument (this list is page-paginated); null when this is the last page."
      • addedOutput schema / properties / total_parties / anyOf
        Added value: +[
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / total_parties / description
        Previous value: -"Total number of parties on this docket across all pages."New value: +"Total parties on this docket across all pages; null when upstream reports no count (a multi-page list whose total is unknown until the last page)."
      • removedOutput schema / properties / total_parties / type
        Removed value: -"number"

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.