> ## Documentation Index
> Fetch the complete documentation index at: https://docs.courtrules.app/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP: Court Rules

> Connect AI agents to judge-specific filing rules and compliance checks using the Model Context Protocol.

# MCP: Court Rules

The Court Rules MCP server gives AI agents access to structured filing rules for 20+ federal courts and 750+ judges, plus 27 state courts and 2,000+ judges. Six tools let you list courts, search judges, retrieve rules, search filing requirements, look up court holidays, and generate compliance check parameters.

## What you get

Six court rules tools:

| Tool | Purpose |
| - | - |
| `list_courts` | Page through courts with active judge counts, or find one by name |
| `search_judges` | Search judges by district, name, or type |
| `get_judge_rules` | Get all rules for a specific judge (page limits, format, procedures) |
| `search_filing_rules` | Search filing requirements: e-filing, service, timing, fees, courtesy copies |
| `list_court_holidays` | List court holidays and closure dates with official source URLs |
| `check_filing_against_judge_rules` | Check a draft filing against a judge's rules before it is filed |

<Note>
  The same MCP server also provides three enforcement data tools for monitoring privacy enforcement
  actions across 21 jurisdictions. See [MCP: Enforcement Data](/guides/mcp-enforcement).
</Note>

## Quick start

Add the server to your AI client, then sign in when the client asks. It opens [console.courtrules.app](https://console.courtrules.app) in your browser, you sign in and approve the connection once, and the client keeps you signed in after that.

### Claude Code

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
claude mcp add --transport http court-rules https://mcp.courtrules.app/mcp
```

Then run `/mcp` in Claude Code, select `court-rules`, and choose **Authenticate**.

### Claude Desktop and claude.ai

Open **Settings > Connectors > Add custom connector**. Enter `Court Rules` as the name and `https://mcp.courtrules.app/mcp` as the URL, click **Add**, then click **Connect** and sign in.

### Cursor

Add to `~/.cursor/mcp.json`, then open **Cursor Settings > MCP** and click the sign-in prompt next to `court-rules`:

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "mcpServers": {
    "court-rules": {
      "url": "https://mcp.courtrules.app/mcp"
    }
  }
}
```

### VS Code

Add to `.vscode/mcp.json`. VS Code asks you to sign in the first time it starts the server.

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "servers": {
    "court-rules": {
      "type": "http",
      "url": "https://mcp.courtrules.app/mcp"
    }
  }
}
```

### Codex CLI

```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
codex mcp add court-rules --url https://mcp.courtrules.app/mcp
codex mcp login court-rules
```

### Scripts, backends, and clients without sign-in

Send the API key from your [console](https://console.courtrules.app) dashboard as `Authorization: Bearer <api_key>`. Keys do not expire. See [Authentication](/authentication#mcp-authentication) for header configs and an SDK example.

Once connected, try asking your agent: *"What are Judge Beaudet's courtesy copy rules at LA Superior Court?"*

## Tool reference

### list\_courts

List courts with their judge counts. There are over 1,000 courts, so results come in pages: pass `query` to find a court, and pass `next_offset` back as `offset` to read the next page. `judge_count` counts judges currently sitting on the court.

**Parameters:**

| Parameter | Type | Description |
| - | - | - |
| `query` | string | Optional. Case-insensitive match on court name or ID (e.g., "alaska", "edny") |
| `limit` | number | Courts per page. Default 100, max 500 |
| `offset` | number | Courts to skip. Pass `next_offset` from the previous page. Default 0 |

**Example request:** `{ "query": "district of new york", "limit": 3 }`

**Example response:**

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "courts": [
    { "district_id": "edny", "name": "Eastern District of New York", "judge_count": 47 },
    { "district_id": "ndny", "name": "Northern District of New York", "judge_count": 3 },
    { "district_id": "sdny", "name": "Southern District of New York", "judge_count": 67 }
  ],
  "total": 12,
  "limit": 3,
  "offset": 0,
  "next_offset": 3
}
```

`next_offset` is `null` on the last page.

### search\_judges

Search for judges by district, name, or type.

**Parameters:**

| Parameter | Type | Description |
| - | - | - |
| `district_id` | string | District identifier (e.g., "ca-los-angeles-superior", "edny") |
| `name` | string | Partial name match |
| `judge_type` | string | "district", "senior", "magistrate", "chief\_district", etc. |
| `limit` | number | Max results (default 20, max 500) |

**Example request:** `{"district_id": "ca-los-angeles-superior", "name": "beaudet"}`

**Example response:**

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
[
  {
    "judge_slug": "judge-teresa-a-beaudet",
    "judge_name": "Judge Teresa A. Beaudet",
    "judge_type": "district",
    "district_id": "ca-los-angeles-superior",
    "status": "active"
  }
]
```

### get\_judge\_rules

Get all extracted rules for a specific judge.

**Parameters:**

| Parameter | Type | Required | Description |
| - | - | - | - |
| `judge_slug` | string | Yes | Judge identifier from search\_judges (e.g., "judge-teresa-a-beaudet") |
| `district_id` | string | Yes | District identifier (e.g., "ca-los-angeles-superior") |

**Example request:** `{"judge_slug": "judge-teresa-a-beaudet", "district_id": "ca-los-angeles-superior"}`

**Example response:**

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
[
  {
    "rule_id": "0067714a-7bfd-4642-86cf-4e2d9190b15d",
    "content": {
      "summary": "Motions in limine must comply with L.A. Superior Court Rule 3.57 and Kelly v. New West Federal Savings.",
      "rule_tags": ["document_requirement", "motion_in_limine"],
      "source_text": "Motions in limine must comply with L.A. Superior Court Rule 3.57 and Kelly v. New West Federal Savings, 49 Cal.App.4th 659, 670-71 (1996).",
      "workflow_phase": "TRIAL_PREP",
      "citation_source": {
        "page": 4,
        "section": "All Motions"
      },
      "structured_data": {
        "logic_type": "DocumentRequirement",
        "document_type": "motion_in_limine",
        "specific_language": "Must comply with L.A. Superior Court Rule 3.57 and Kelly v. New West Federal Savings, 49 Cal.App.4th 659, 670-71 (1996)."
      },
      "visual_severity": "CRITICAL",
      "case_type_applicability": ["civil"]
    },
    "doc_kind": "individual_rules",
    "document_date": null,
    "source_url": "https://www.lacourt.ca.gov/web3/courthouse/api/courthouses/courtroom-information/courthouse/LAM/courtrooms/508/documents"
  },
  {
    "rule_id": "0135e5a3-4c3d-4feb-bc55-5bb44aa36981",
    "content": {
      "summary": "Courtesy conformed copies of filings with points and authorities or exceeding 15 pages must be lodged in Dept. 508 on the filing date (next business day if efiled on a holiday or weekend).",
      "rule_tags": ["courtesy_copy"],
      "source_text": "Courtesy conformed copies of any filings with a points and authorities or that exceed 15 pages must be lodged in Dept. 508 on the date of filing or, if the filing is efiled on a holiday or weekend, on the next business day.",
      "workflow_phase": "MOTION_PRACTICE",
      "citation_source": {
        "page": 3
      },
      "structured_data": {
        "trigger": {
          "type": "page_threshold",
          "value": 15,
          "operator": ">"
        },
        "exemptions": {
          "description": "If the filing is efiled on a holiday or weekend, courtesy copies must be lodged on the next business day. Filings with points and authorities also require courtesy copies regardless of length."
        },
        "logic_type": "CourtesyCopyRule",
        "requirement": {
          "delivery_method": "chambers_drop_off",
          "delivery_timing": "upon_filing"
        }
      },
      "visual_severity": "CRITICAL",
      "case_type_applicability": ["civil"]
    },
    "doc_kind": "individual_rules",
    "document_date": null,
    "source_url": "https://www.lacourt.ca.gov/web3/courthouse/api/courthouses/courtroom-information/courthouse/LAM/courtrooms/508/documents"
  }
]
```

### search\_filing\_rules

Search extracted filing rules across active source documents. Use this for e-filing requirements, service and proof of service, filing timing, fees, courtesy copies, rejection and cure windows, and courtroom preferences.

Unlike `get_judge_rules`, which returns everything for one judge, this searches across courts and judges by keyword and rule type.

**Parameters:**

| Parameter | Type | Required | Description |
| - | - | - | - |
| `q` | string | No | Search terms matched against summary, source text, tags, and structured data |
| `district_id` | string | No | Court identifier (e.g., "il-cook-circuit", "ca-los-angeles-superior") |
| `judge_slug` | string | No | Judge, calendar, department, or courtroom slug. Use `"court"` for court-level rules |
| `logic_type` | string | No | Rule type, e.g. `ElectronicFilingRule`, `FilingTimingRule`, `ServiceRule`, `FilingFeeRule` |
| `workflow_phase` | string | No | One of `FILING`, `CASE_INITIATION`, `MOTION_PRACTICE`, `TRIAL_PREP`, `POST_JUDGMENT` |
| `case_type` | string | No | Filter by case type. General rules and rules without a case-type limit are always included |
| `include_court_rules` | boolean | No | When `judge_slug` is set, also include court-level rules. Default `true` |
| `include_raw_content` | boolean | No | Include the full validated rule object. Default `false` |
| `limit` | number | No | Max results (default 100, max 500) |

**Example response:**

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "rules": [
    {
      "rule_id": "8f2c1a4e-...",
      "district_id": "edny",
      "judge_slug": "court",
      "logic_type": "ElectronicFilingRule",
      "summary": "All documents must be filed electronically through ECF unless the filer is pro se",
      "citation": "Local Civil Rule 5.2",
      "source_text": "Except as otherwise provided, all documents shall be filed electronically...",
      "provenance": {
        "source_url": "https://www.nyed.uscourts.gov/local-rules",
        "document_version_id": "3b91..."
      }
    }
  ],
  "meta": { "total": 1, "limit": 100, "include_court_rules": true }
}
```

### list\_court\_holidays

List court holidays and closure dates. Returns the official source URL and the last time Court Rules checked that source, so you can show provenance alongside a deadline calculation.

**Parameters:**

| Parameter | Type | Required | Description |
| - | - | - | - |
| `district_id` | string | No | Court identifier (e.g., "edny") |
| `year` | number | No | Calendar year (e.g., 2026) |
| `date_from` | string | No | Start date filter (YYYY-MM-DD) |
| `date_to` | string | No | End date filter (YYYY-MM-DD) |
| `limit` | number | No | Max results (default 50, max 200) |

**Example response:**

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "holidays": [
    {
      "district_id": "edny",
      "calendar_year": 2026,
      "holiday_date": "2026-01-19",
      "holiday_name": "Birthday of Martin Luther King, Jr.",
      "source_url": "https://www.nyed.uscourts.gov/holiday-schedule",
      "last_checked_at": "2026-05-13T12:00:00.000Z"
    }
  ],
  "meta": { "total": 1, "limit": 50 }
}
```

### check\_filing\_against\_judge\_rules

Check a draft filing against a judge's rules before it is filed. The assistant reads the draft, measures it (pages, words, which sections it has), and passes those measurements. Court Rules compares them with the judge's limits and requirements and returns a pass or fail for each rule, with the rule it comes from.

The draft itself is never sent. Only the measurements are, so the check works in any client, including ones that cannot attach files to a tool call.

**Coverage:** judges in the Eastern District of New York (`edny`). For another court, the tool returns an error that says so; read that court's rules with `get_judge_rules` instead.

**Parameters:**

| Parameter | Type | Required | Description |
| - | - | - | - |
| `judge_slug` | string | Yes | Judge identifier from search\_judges (e.g., "carol-bagley-amon") |
| `district_id` | string | Yes | Court identifier (e.g., "edny") |
| `document_scope` | string | Yes | Document type: `brief_support`, `brief_opposition`, `brief_reply`, `letter`, `proposed_findings`, ... |
| `motion_type` | string | No | Rule the motion is under (e.g., `Rule_56`). Omit if the filing is not a motion |
| `is_pro_se` | boolean | Yes | Whether the filer is self-represented |
| `pmc_completed` | boolean | Yes | Whether a pre-motion conference was held or waived |
| `opposing_party_pro_se` | boolean | Yes | Whether the opposing party is self-represented |
| `filing_role` | string | Yes | `movant`, `opponent`, or `reply` |
| `document` | object | Yes | Measurements of the draft. Only `page_count` and `word_count` are required |

`document` also accepts `caption`, `signature_block`, `sections`, `format` and `privacy`, with the same fields as [`/api/v1/check`](/api-reference/check). A section left out is not guessed: its checks are skipped and named in `warnings`.

**Example request:** a 5-page pre-motion letter to Judge Amon.

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "judge_slug": "carol-bagley-amon",
  "district_id": "edny",
  "document_scope": "letter",
  "is_pro_se": false,
  "pmc_completed": false,
  "opposing_party_pro_se": false,
  "filing_role": "movant",
  "document": { "page_count": 5, "word_count": 1400 }
}
```

**Example response:**

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "judge": { "slug": "carol-bagley-amon", "name": "Carol Bagley Amon" },
  "summary": {
    "status": "NON_COMPLIANT",
    "failures": 1,
    "warnings": 0,
    "passes": 1,
    "action_items": 0
  },
  "results": [
    {
      "severity": "CRITICAL",
      "category": "PAGE_LIMIT",
      "message": "5pp exceeds 3pp limit",
      "source": "Amon SO §3.A",
      "status": "FAIL"
    },
    {
      "severity": "INFO",
      "category": "COURTESY_COPY",
      "message": "5pp does not exceed 5pp threshold, no courtesy copy needed",
      "source": "Amon SO §1.D / §3.D.iii",
      "status": "PASS"
    }
  ],
  "meta": { "checks_run": 2, "checks_skipped": 11 },
  "warnings": [
    "The following document sections were not provided: caption, signature_block, sections, format, privacy. Related compliance checks were skipped."
  ]
}
```

`summary.status` is `NON_COMPLIANT` when any rule fails, `REVIEW` when a rule needs an action from the filer (such as requesting a pre-motion conference), and `COMPLIANT` otherwise. The response matches [`/api/v1/check`](/api-reference/check) for the same input.

**Common mistakes:**

* **Counting every page.** `page_count` is body pages only. Leave out the cover, tables of contents and authorities, signature page and certificates.
* **Filling sections that were not read.** A guessed `format` or `privacy` block produces a confident result about something nobody measured. Leave it out.

## Integration patterns

### Pre-filing requirements

Show judge-specific rules while a document is drafted:

```
1. search_judges (district_id, name) -> resolve the judge
2. get_judge_rules (judge_slug, district_id) -> show requirements during drafting
3. Link each requirement to its source document
4. check_filing_against_judge_rules (judge_slug, district_id, measurements) -> check the draft before it is filed
```

Call `get_judge_rules` early in the drafting process so users see requirements before they finish writing, then `check_filing_against_judge_rules` on the finished draft. From a backend without an assistant, call the REST API at [`/api/v1/check`](/api-reference/check) with the same input.

## Error handling

MCP tool calls return errors as text content, not HTTP error codes. If a tool encounters an error (invalid parameters, database unavailable), the response will contain a descriptive error message in the `content` array:

```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
  "content": [
    {
      "type": "text",
      "text": "Error: No judge found with slug \"invalid-slug\" in district \"edny\"."
    }
  ]
}
```

Common error patterns:

* **Invalid judge\_slug**: `"No judge found with slug \"...\" in district \"...\"."`
* **Invalid district\_id**: `"No court found with ID \"...\"."`
* **Database error**: `"Error querying courts: ..."` or `"Error searching judges: ..."`

The hosted server at `mcp.courtrules.app` does not currently enforce rate limits on MCP tool calls.

## Next steps

* [REST API Quickstart](/quickstart) to run compliance checks directly via HTTP
* [Coverage Levels](/concepts/coverage-levels) to understand the three rule layers (FRCP, Local Rules, Standing Orders)
* [MCP: Enforcement Data](/guides/mcp-enforcement) for privacy enforcement tools on the same MCP server


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.