MCP server for CourtListener legal database with semantic search
The server demonstrates solid foundation with 12 well-named tools covering a coherent legal research domain. All tools have clear, action-verb names (semantic_search, keyword_search, get_case, etc.) and descriptions are present and meaningful (avg ~120 chars). Input schemas are comprehensively defined using Pydantic models with proper types, constraints, and descriptions. However, output schemas are entirely undocumented, the code shows Pydantic input models but provides no schema definition for what each tool returns. This is a critical gap that prevents LLMs from understanding response structure. Additionally, error handling is minimal; there's no evidence of actionable recovery guidance or error categorization. The server lacks tool annotations (readOnlyHint, destructiveHint) despite all tools being read-only, which is a missed opportunity for clarity. Date parameters use proper regex patterns, limits are enforced (1-100 for most), and response format enums are present, but the overall absence of output documentation and error patterns costs the score significantly.
Get detailed information about a specific case
Find cases that cite a specific opinion
Get information about a specific court
Get docket information for a case
Get the full text of a specific opinion
Search CourtListener combining semantic understanding with required keywords
Search CourtListener using Boolean operators, phrases, and wildcards for precise fielded queries
Output schemas completely undocumented. No tool defines what fields are returned, their types, or structure. LLMs cannot plan downstream calls or extract data reliably without knowing response structure.
No error handling or recovery guidance in tool implementations. Code shows API calls (get_client()) but no visible try-catch blocks, validation of responses, or actionable error messages. If an API call fails, the LLM receives no guidance on retry strategy or alternatives.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 59 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 13 | - | v1 |
List all available courts in the CourtListener database
Search for judges by name or query
Search for oral argument recordings and information
Search CourtListener using natural language descriptions of legal issues
Validate and verify legal citations in text
No tool annotations despite all tools being read-only. Missing readOnlyHint=true in tool metadata. This forces LLMs to reason about safety based only on names/descriptions rather than explicit hints.
Response format enums ('json', 'markdown') are offered but no documentation exists for what each format produces. The tool description in SemanticSearchInput says 'json for structured data, markdown for readable text' but the actual transformation logic is not visible.
No visible result limits enforced in code. While input schemas cap limit to 100 for search tools, there's no evidence of response truncation, pagination, or guidance on what happens when CourtListener API returns thousands of results. Without active result limiting, responses risk context window exhaustion.