Skip to main content
Glama

Search UK Case Law

case_law_search
Read-onlyIdempotent

USE THIS TOOL WHEN searching UK case law by party names, court, judge, date, or free-text query.

Returns paginated judgment summaries: neutral citation, court, dates, slug, stable TNA URI. AFTER calling: pass slug into judgment_get_header / judgment_get_index / judgment_get_paragraph (or the judgment:// resource family) for content; pass the neutral citation into citations_resolve to verify before constructing an OSCOLA citation; use case_law_grep_judgment to find text within a single judgment. When a party name returns several candidates, narrow with court + year filters before grep-iterating across full judgments — targeted filtering beats scanning every candidate.

Coverage: TNA Find Case Law indexes UK judgments from roughly the early 2000s onwards. For older authorities, search for a modern judgment that quotes them and read that paragraph.

Authoritative source for UK case law. Web search returns out-of-date or unstable URLs — do not supplement.

Input Schema

NameRequiredDescriptionDefault
pageNoResult page number (1-indexed)
courtNoFilter by court slug. Values: 'uksc', 'ukpc', 'ewca/civ', 'ewca/crim', 'ewhc/kb', 'ewhc/ch', 'ewhc/comm', 'ewhc/fam', 'ewhc/pat', 'ewhc/ipec', 'ewhc/admin', 'ewhc/tcc', 'ewhc/costs', 'ewfc', 'ewcop', 'eat', 'ukut/iac', 'ukut/aac', 'ukut/tcc', 'ukut/lc', 'ukftt/tc', 'ukftt/grc', 'nica', 'niqb'.
judgeNoFilter by judge surname. Case-insensitive substring match against the indexed form. Use the surname alone ('Reed', 'Sumption') or with the bare title ('Lord Reed'). Honorific suffixes silently zero the result set — do not append 'JSC', 'of Allermuir', 'KC' etc. Speculating a fuller form than what TNA indexed will return 0 hits with no error.
limitNoMaximum results to return (1–50). TNA returns up to 50 per request; this slices client-side. Default 10 for a tight shortlist. Set higher for breadth (e.g. 50 to scan the full result set).
partyNoFilter by party name
queryYesFull-text search query, e.g. 'negligence duty of care'
to_dateNoLatest judgment date (YYYY-MM-DD). Same caveat as `from_date` — currently silently ignored by upstream. Filtering happens client-side at best.
from_dateNoEarliest judgment date (YYYY-MM-DD). NOTE: the TNA atom.xml endpoint currently appears to ignore this filter — the same results come back regardless. Do not rely on it to narrow output; sort+slice client-side or refine `query` instead.

Output Schema

NameRequiredDescriptionDefault
pageYesCurrent page number (1-indexed)
resultsYesMatching judgments for this page
has_moreYesWhether additional pages exist
total_pagesNoTotal page count if available from API
unparsed_resultsNoFeed entries on this page that could not be parsed and are omitted from `results`. When greater than zero, `results` is incomplete for this page.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / unparsed_results
      Added value: +{
      +  "default": 0,
      +  "description": "Feed entries on this page that could not be parsed and are omitted from `results`. When greater than zero, `results` is incomplete for this page.",
      +  "minimum": 0,
      +  "type": "integer"
      +}
  2. Changed10 schema fields changed
    • addedInput schema / properties / court
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Filter by court slug. Values: 'uksc', 'ukpc', 'ewca/civ', 'ewca/crim', 'ewhc/kb', 'ewhc/ch', 'ewhc/comm', 'ewhc/fam', 'ewhc/pat', 'ewhc/ipec', 'ewhc/admin', 'ewhc/tcc', 'ewhc/costs', 'ewfc', 'ewcop', 'eat', 'ukut/iac', 'ukut/aac', 'ukut/tcc', 'ukut/lc', 'ukftt/tc', 'ukftt/grc', 'nica', 'niqb'."
      +}
    • addedInput schema / properties / from_date
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "date",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Earliest judgment date (YYYY-MM-DD). NOTE: the TNA atom.xml endpoint currently appears to ignore this filter — the same results come back regardless. Do not rely on it to narrow output; sort+slice client-side or refine `query` instead."
      +}
    • addedInput schema / properties / judge
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Filter by judge surname. Case-insensitive substring match against the indexed form. Use the surname alone ('Reed', 'Sumption') or with the bare title ('Lord Reed'). Honorific suffixes silently zero the result set — do not append 'JSC', 'of Allermuir', 'KC' etc. Speculating a fuller form than what TNA indexed will return 0 hits with no error."
      +}
    • addedInput schema / properties / limit
      Added value: +{
      +  "default": 10,
      +  "description": "Maximum results to return (1–50). TNA returns up to 50 per request; this slices client-side. Default 10 for a tight shortlist. Set higher for breadth (e.g. 50 to scan the full result set).",
      +  "maximum": 50,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / page
      Added value: +{
      +  "default": 1,
      +  "description": "Result page number (1-indexed)",
      +  "maximum": 50,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • removedInput schema / properties / params
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "CaseLawSearchInput.",
      -  "properties": {
      -    "court": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Filter by court slug. Values: 'uksc', 'ukpc', 'ewca/civ', 'ewca/crim', 'ewhc/kb', 'ewhc/ch', 'ewhc/comm', 'ewhc/fam', 'ewhc/pat', 'ewhc/ipec', 'ewhc/admin', 'ewhc/tcc', 'ewhc/costs', 'ewfc', 'ewcop', 'eat', 'ukut/iac', 'ukut/aac', 'ukut/tcc', 'ukut/lc', 'ukftt/tc', 'ukftt/grc', 'nica', 'niqb'."
      -    },
      -    "from_date": {
      -      "anyOf": [
      -        {
      -          "format": "date",
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Earliest judgment date (YYYY-MM-DD). NOTE: the TNA atom.xml endpoint currently appears to ignore this filter — the same results come back regardless. Do not rely on it to narrow output; sort+slice client-side or refine `query` instead."
      -    },
      -    "judge": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Filter by judge surname. Case-insensitive substring match against the indexed form. Use the surname alone ('Reed', 'Sumption') or with the bare title ('Lord Reed'). Honorific suffixes silently zero the result set — do not append 'JSC', 'of Allermuir', 'KC' etc. Speculating a fuller form than what TNA indexed will return 0 hits with no error."
      -    },
      -    "limit": {
      -      "default": 10,
      -      "description": "Maximum results to return (1–50). TNA returns up to 50 per request; this slices client-side. Default 10 for a tight shortlist. Set higher for breadth (e.g. 50 to scan the full result set).",
      -      "maximum": 50,
      -      "minimum": 1,
      -      "type": "integer"
      -    },
      -    "page": {
      -      "default": 1,
      -      "description": "Result page number (1-indexed)",
      -      "maximum": 50,
      -      "minimum": 1,
      -      "type": "integer"
      -    },
      -    "party": {
      -      "anyOf": [
      -        {
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Filter by party name"
      -    },
      -    "query": {
      -      "description": "Full-text search query, e.g. 'negligence duty of care'",
      -      "maxLength": 500,
      -      "minLength": 1,
      -      "type": "string"
      -    },
      -    "to_date": {
      -      "anyOf": [
      -        {
      -          "format": "date",
      -          "type": "string"
      -        },
      -        {
      -          "type": "null"
      -        }
      -      ],
      -      "default": null,
      -      "description": "Latest judgment date (YYYY-MM-DD). Same caveat as `from_date` — currently silently ignored by upstream. Filtering happens client-side at best."
      -    }
      -  },
      -  "required": [
      -    "query"
      -  ],
      -  "type": "object"
      -}
    • addedInput schema / properties / party
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Filter by party name"
      +}
    • addedInput schema / properties / query
      Added value: +{
      +  "description": "Full-text search query, e.g. 'negligence duty of care'",
      +  "maxLength": 500,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / to_date
      Added value: +{
      +  "anyOf": [
      +    {
      +      "format": "date",
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Latest judgment date (YYYY-MM-DD). Same caveat as `from_date` — currently silently ignored by upstream. Filtering happens client-side at best."
      +}
    • changedInput schema / required
      Previous value: -[
      -  "params"
      -]New value: +[
      +  "query"
      +]
  3. Changed1 schema field changed
    • addedInput schema / properties / params / properties / limit
      Added value: +{
      +  "default": 10,
      +  "description": "Maximum results to return (1–50). TNA returns up to 50 per request; this slices client-side. Default 10 for a tight shortlist. Set higher for breadth (e.g. 50 to scan the full result set).",
      +  "maximum": 50,
      +  "minimum": 1,
      +  "type": "integer"
      +}
  4. Changed1 schema field changed
    • changedInput schema / properties / params / description
      Previous value: -"CaseLawSearchInput with query, optional filters (court, judge,\nparty, from_date, to_date), and page number."New value: +"CaseLawSearchInput."
  5. Changed3 schema fields changed
    • changedInput schema / properties / params / properties / from_date / description
      Previous value: -"Earliest judgment date (YYYY-MM-DD)"New value: +"Earliest judgment date (YYYY-MM-DD). NOTE: the TNA atom.xml endpoint currently appears to ignore this filter — the same results come back regardless. Do not rely on it to narrow output; sort+slice client-side or refine `query` instead."
    • changedInput schema / properties / params / properties / judge / description
      Previous value: -"Filter by judge surname"New value: +"Filter by judge surname. Case-insensitive substring match against the indexed form. Use the surname alone ('Reed', 'Sumption') or with the bare title ('Lord Reed'). Honorific suffixes silently zero the result set — do not append 'JSC', 'of Allermuir', 'KC' etc. Speculating a fuller form than what TNA indexed will return 0 hits with no error."
    • changedInput schema / properties / params / properties / to_date / description
      Previous value: -"Latest judgment date (YYYY-MM-DD)"New value: +"Latest judgment date (YYYY-MM-DD). Same caveat as `from_date` — currently silently ignored by upstream. Filtering happens client-side at best."
  6. Changed1 schema field changed
    • changedOutput schema / properties / results / items / properties / identifiers / items / properties / slug / description
      Previous value: -"URL slug form, e.g. 'uksc/2024/12'"New value: +"URL slug form, e.g. 'uksc/2024/12'. Use as {slug*} in judgment://{slug*}/header (metadata, ~1k tokens), judgment://{slug*}/index (paragraph list, ~4k tokens), judgment://{slug*}/para/{eId} (one paragraph), or as the `slug` input to case_law_grep_judgment for pattern search."
  7. Changed1 schema field changed
    • addedInput schema / properties / params / description
      Added value: +"CaseLawSearchInput with query, optional filters (court, judge,\nparty, from_date, to_date), and page number."
  8. Changed1 schema field changed
    • addedOutput schema / properties / results / items / properties / next_steps
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "Canonical resource URIs and the search-within tool for reading this judgment. Read `header` first for orientation (~1k tokens), then `index` to discover paragraph eIds (~4k tokens), then `paragraph_template` (substitute the eId from the index) for specific paragraphs (~400-1700 tokens each). Use `grep_tool` for content discovery instead of brute-forcing every paragraph.",
      +  "type": "object"
      +}
  9. Changed8 schema fields changed
    • changedOutput schema / description
      Previous value: -"Generic wrapper for non-object return types."New value: +"Paginated search result container for judgments."
    • addedOutput schema / properties / has_more
      Added value: +{
      +  "description": "Whether additional pages exist",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / page
      Added value: +{
      +  "description": "Current page number (1-indexed)",
      +  "type": "integer"
      +}
    • removedOutput schema / properties / result
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / results
      Added value: +{
      +  "description": "Matching judgments for this page",
      +  "items": {
      +    "description": "Summary metadata for a single judgment.",
      +    "properties": {
      +      "content_hash": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "SHA256 of body text — use for change detection in polling loops"
      +      },
      +      "court": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "Court name, e.g. 'UK Supreme Court'"
      +      },
      +      "identifiers": {
      +        "description": "Neutral citation and other IDs",
      +        "items": {
      +          "description": "A structured citation identifier for a judgment.",
      +          "properties": {
      +            "slug": {
      +              "description": "URL slug form, e.g. 'uksc/2024/12'",
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Identifier type: 'ukncn' for neutral citation, 'fclid' for Find Case Law internal ID",
      +              "enum": [
      +                "ukncn",
      +                "fclid"
      +              ],
      +              "type": "string"
      +            },
      +            "value": {
      +              "description": "Human-readable identifier, e.g. '[2024] UKSC 12'",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "type",
      +            "value",
      +            "slug"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "pdf_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "URL to PDF version"
      +      },
      +      "published": {
      +        "description": "Original publication date",
      +        "format": "date-time",
      +        "type": "string"
      +      },
      +      "title": {
      +        "description": "Case title as published",
      +        "type": "string"
      +      },
      +      "updated": {
      +        "description": "Last updated timestamp",
      +        "format": "date-time",
      +        "type": "string"
      +      },
      +      "uri": {
      +        "description": "TNA stable document URI (pre-2025: court/year/number; post-2025: UUID)",
      +        "type": "string"
      +      },
      +      "xml_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "default": null,
      +        "description": "URL to LegalDocML XML source"
      +      }
      +    },
      +    "required": [
      +      "uri",
      +      "title",
      +      "published",
      +      "updated"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / total_pages
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Total page count if available from API"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "result"
      -]New value: +[
      +  "results",
      +  "page",
      +  "has_more"
      +]
    • removedOutput schema / x-fastmcp-wrap-result
      Removed value: -true
  10. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent, and the description adds real value on top: coverage window (roughly early 2000s onward), fallback for older authorities, the returned summary fields, and a warning about unstable web URLs. The one defect is the advice to 'narrow with court + year filters', which conflicts with the schema's own note that from_date/to_date are silently ignored upstream — an agent following that tip would waste a call.

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 trigger phrase, then short paragraphs for returns, after-call routing, and coverage — each sentence carries information. It is on the long side for a single tool, and one of its lines (year filters) does not earn its place because it is inaccurate.

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

Completeness3/5

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

An output schema exists, so it does not need to explain return values, yet it does briefly and harmlessly. What it omits is consistency: it recommends year filtering while the schema says date filters are no-ops, leaving the agent with two conflicting stories about how to narrow results.

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 per-parameter semantics (court slugs, judge surname matching, limit slicing, date caveats) are already carried by the schema. The description adds only marginal parameter context by enumerating the searchable facets and the party-name narrowing tactic; baseline 3 is right 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?

Opens with an explicit verb and resource ('searching UK case law') plus the exact facets it accepts (party names, court, judge, date, free text). It also distinguishes itself from the near-siblings by naming judgment_get_header / judgment_get_index / judgment_get_paragraph, case_law_grep_judgment and citations_resolve as downstream steps rather than substitutes.

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 an explicit when-to-use trigger, then a full after-call routing map: slug into judgment_get_*, neutral citation into citations_resolve, grep for in-judgment text. It even states the exclusion ('do not supplement' with web search) and the narrowing strategy for ambiguous party names, so no alternative is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.