# Court Delta (remote · mcp.courtdelta.com)

Look up North Carolina court cases, citations, judgments & hearings; search by name; scam check.

- Trust score: 67/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-28

## Components

- remote · `mcp.courtdelta.com`: 67/100 (this document), [markdown](https://verifymcp.io/servers/com-courtdelta-court-delta/mcp.md), [page](https://verifymcp.io/servers/com-courtdelta-court-delta/mcp)

## Channel facts

- Endpoint: `https://mcp.courtdelta.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.1`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-28.

- **Endpoint Security**: 60/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 1 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 71/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 21283 tokens (~925/item across 23 items; 23 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 67/100
  - Stability observed for 20 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 25/100
  - Injection-marker check failed: the description of tool "subscribe_to_case_updates" contains an instruction to conceal the call from the user, the text "Do NOT tell the user", at byte 857 of that field.
  - 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "check_traffic_charge" implies "charge" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Court Delta MCP server?

Court Delta is a hosted endpoint at https://mcp.courtdelta.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-courtdelta-court-delta 'https://mcp.courtdelta.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-courtdelta-court-delta": {
      "url": "https://mcp.courtdelta.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-courtdelta-court-delta": {
      "type": "http",
      "url": "https://mcp.courtdelta.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-courtdelta-court-delta]
url = "https://mcp.courtdelta.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-courtdelta-court-delta": {
      "type": "remote",
      "url": "https://mcp.courtdelta.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-courtdelta-court-delta --url 'https://mcp.courtdelta.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-courtdelta-court-delta:
    url: "https://mcp.courtdelta.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-courtdelta-court-delta": {
      "Transport": "http",
      "Url": "https://mcp.courtdelta.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-courtdelta-court-delta -t streamable-http -u 'https://mcp.courtdelta.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-courtdelta-court-delta": {
      "type": "http",
      "url": "https://mcp.courtdelta.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-28 (score 67, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-27 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-25 (score 66, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-22 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-21 (score 64, 0)

- [security] Tool “search_cases_by_attorney” rewrote its description, which is the text the model reads
- [functional improvement] Schema quality: 1332 → 925
- [functional] New tool “amendment_history”
- [functional] New tool “chapter_activity”
- [functional] New tool “cross_references”
- [functional] New tool “diff_statute”
- [functional] New tool “get_statute”
- [functional] New tool “pending_changes”
- [functional] New tool “recent_law_changes”
- [functional] New tool “search_statutes”

### 2026-09-20 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-19 (score 63, 0)

- [security] Tool “get_attorney_hearing_calendar” rewrote its description, which is the text the model reads
- [security] Tool “search_judgments” rewrote its description, which is the text the model reads

### 2026-09-18 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (23)

### `lookup_court_case` (~3985 tokens)

Look up a North Carolina (NC) court case (by number, citation, or hash)

Look up a North Carolina (NC) court case or traffic citation.

Provide a case number (e.g. "26CV001234-012"), a citation number
(e.g. "92403H2"), OR a `portalSessionRef` from a `search_cases_by_party` row.
\`caseNumber` is the STABLE, canonical identifier — prefer it for anything that
isn't an immediate follow-up. `portalSessionRef` is a fast path that resolves an
already-searched case without re-running the portal search. Its lifetime is
UNSPECIFIED and not guaranteed — the value rotates on every search and should be
treated as short-lived (it survives at least minutes; the upper bound is unmeasured);
never persist or reuse it. (`caseHash` is accepted as a deprecated alias for
\`portalSessionRef`.)
Returns case status, upcoming and recently-elapsed hearing dates/times/
locations, charges (including speed fields for traffic cases), and — for
traffic charges — whether each charge is waivable or requires a court
appearance under the NC AOC schedules, plus how to request a reduction or
dismissal (online via NC Guide & File when the county participates, else in
person via the District Attorney) in `citationOptions.howToRequest`. Those are
OPTIONS WITH CONSEQUENCES, NOT A RECOMMENDATION: waiving is a guilty plea to the
charge as written (an admission of responsibility on an infraction), while a
reduction changes the charge before any plea, and both have to be completed BEFORE
THE CASE IS CALLED — not merely on or before the court date. Present them as choices,
not advice; `citationOptions.notice` carries this caveat verbatim.

\`citationOptions.state` IS THE RESOLUTION PATH AND OUTRANKS THE PER-CHARGE CLASSES.
Two of its values turn on the clock, and both forbid "no appearance needed" no matter
how many charges read `waivable`: "lastDay" (the hearing is TODAY — settleable with
the clerk only before the case is called, no time to file online) and "noCourtDate"
(no upcoming hearing, or today's has already been called — do not assert a failure to
appear, since the person may…

Input parameters:

- `caseHash`
- `caseNumber`
- `citation`
- `portalSessionRef`

### `search_cases_by_party` (~1125 tokens)

Search North Carolina (NC) court cases by party (person) name

Search North Carolina (NC) court cases by a person's name.

Returns (person, case) matches from the NC eCourts party-name search. Each row
carries a `case_number` (the stable id) and a `portal_session_ref` — a Tyler token
whose lifetime is UNSPECIFIED (it rotates every search; survives at least minutes;
upper bound unmeasured). Pass it to `lookup_court_case` (as `portalSessionRef`) for a
quick follow-up; for anything persisted or delayed use `case_number`. Never persist
or reuse the ref. Each row also carries `portal_url` — the direct NC eCourts source
record; it embeds the same short-lived token, so treat it like the ref (don't persist).
\`caseSummaryUrl` (from `lookup_court_case`) is the durable link.
EVERY ROW NOW CARRIES `case_status`, with no `enrich` needed — so do not call
\`lookup_court_case` merely to find out whether a case is open or closed.
The returned text is FINER-GRAINED than the four filter values: alongside "Pending"
and "Disposed" you will see "Disposed - Voluntary Dismissal", "Disposed - Dismissal
on Order of the Court", "Disposed - Clerk of Superior Court" — i.e. HOW it ended, not
just that it did. So never test it with equality against the filter vocabulary
(`status == "Disposed"` misses most disposed rows); match on a prefix, and quote the
portal's own wording when you report it.

Rows carry `party_type` (the person's role) plus `party_role_source`: "caption"
\= surname confirmed in the case caption (trust it); "portal_party_type" = role
from the portal's own PartyTypeKey but no caption to confirm (common on SP /
foreclosure cases — usable, but corroborate for high-stakes use); null = no role
(or a role dropped as suspect, e.g. a citing officer mislabeled "Defendant" on
someone else's caption). For an AUTHORITATIVE role/roster, call `lookup_court_case`
and read its `parties` list. `party_role_verified` (bool) = source == "caption".
Read-only. NC only. Informational, not legal advice.

Required: `last`, `first`. Filters differ in where they apply…

Input parameters:

- `case_status`
- `case_type`
- `confirm_broad` (boolean)
- `county`
- `file_date_end`
- `file_date_start`
- `first` (string, required)
- `last` (string, required)
- `limit` (integer)
- `soundex` (boolean)

### `search_cases_by_attorney` (~894 tokens)

Find an attorney's cases by North Carolina (NC) State Bar number

Cases where an attorney is counsel of record — by bar number OR by name.

"What's on my docket?" for a lawyer or firm. Returns the case number, caption,
filing date, case type and county for every case the register lists that attorney
on. Each `case_number` goes straight into `lookup_court_case`.

EVERY ROW NOW CARRIES `case_status`, with no `enrich` needed — so do not call
\`lookup_court_case` merely to find out whether a case is open or closed.
The returned text is FINER-GRAINED than the four filter values: alongside "Pending"
and "Disposed" you will see "Disposed - Voluntary Dismissal", "Disposed - Dismissal
on Order of the Court", "Disposed - Clerk of Superior Court" — i.e. HOW it ended, not
just that it did. So never test it with equality against the filter vocabulary
(`status == "Disposed"` misses most disposed rows); match on a prefix, and quote the
portal's own wording when you report it.

FAST — about 3-15 seconds. This uses the portal's own attorney-search mode, not
the slow WAF-and-CAPTCHA hearing scrape, so do NOT warn the user about a long
wait here.

PASS EITHER `bar` OR BOTH `last` AND `first` — a first name alone or a last name
alone is rejected. Prefer the bar number when you have it: it resolves to exactly
one attorney, whereas a name can match several.

WHEN A NAME MATCHES MORE THAN ONE ATTORNEY, `attorney_name` comes back NULL and
\`matched_attorneys` lists everyone matched — the results are then a MERGED docket
spanning all of them. Say so and offer to narrow by bar number; do not present it
as one lawyer's caseload. When exactly one attorney matched, `attorney_name` is
set, and it is worth echoing so the user can confirm it resolved to who they meant.

\`case_status="Pending"` is usually what someone means by "my cases" — without it
you get their entire history, which for a working attorney is mostly closed
matters and will hit the cap below. Old cases legitimately remain Pending, so a
2016 case in a Pending list is not necessarily an error.

THE…

Input parameters:

- `bar`
- `case_status`
- `county`
- `file_date_end`
- `file_date_start`
- `first`
- `last`
- `limit` (integer)

### `search_cases_by_business` (~804 tokens)

Find a company's court cases by business name

Cases with a COMPANY as a party — by business name.

Use this, not `search_cases_by_party`, whenever the subject is an organization:
an LLC, corporation, insurer, hospital, landlord, dealership or municipality.
Party search requires a first AND last name, which a business does not have, so
it cannot answer this at all.

FAST — about 5-45 seconds. No CAPTCHA. Do not warn about a long wait.

EVERY ROW NOW CARRIES `case_status`, with no `enrich` needed — so do not call
\`lookup_court_case` merely to find out whether a case is open or closed.
The returned text is FINER-GRAINED than the four filter values: alongside "Pending"
and "Disposed" you will see "Disposed - Voluntary Dismissal", "Disposed - Dismissal
on Order of the Court", "Disposed - Clerk of Superior Court" — i.e. HOW it ended, not
just that it did. So never test it with equality against the filter vocabulary
(`status == "Disposed"` misses most disposed rows); match on a prefix, and quote the
portal's own wording when you report it.

TYPE THE NAME AS IT APPEARS, COMMA INCLUDED. The comma is significant and
NARROWING: "FOOD LION, LLC" is a different, smaller search than "FOOD LION". Do
not strip it, and do not replace it with a wildcard — advice to do that appears in
the portal's help text but applies to a different search mode.

WILDCARD: a trailing `*` is allowed and needs AT LEAST 4 characters before it.
"WALM*" works; "WAL*" is rejected. Use it for a company whose exact registered
name you do not know ("CAROLINA TOWING*").

THERE IS NO PARTY ROLE IN THIS RESULT, ON PURPOSE. The portal labels every row
"Defendant" regardless of the truth — including cases the company FILED as
plaintiff and criminal cases where it was the victim. NEVER say the business is
the defendant. Read the side from `case_name` ("X VS Y" — the company's position
in the caption is the real signal), or call `lookup_court_case` for the actual
party list.

THE 200-CASE CAP BITES IMMEDIATELY FOR ANY CHAIN OR INSURER. `results_truncated:
true…

Input parameters:

- `case_status`
- `county`
- `file_date_end`
- `file_date_start`
- `limit` (integer)
- `name` (string, required)

### `get_attorney_hearing_calendar` (~801 tokens)

An attorney's court calendar (hearings) by North Carolina (NC) State Bar number

"What am I in court for today?" — an attorney's HEARING CALENDAR, by bar number OR by name.

REQUIRES `bar`, OR BOTH `last` AND `first`. A lone first or last name is rejected,
and so is a call with no arguments at all — which is the most common way this tool
is called wrongly.

Returns every scheduled hearing in the date range: date and time, case number,
caption, hearing type, judge and courtroom. Defaults to TODAY in North Carolina (NC)
when no dates are given, so `get_attorney_hearing_calendar(bar="21262")` is
exactly "what's on my calendar today".

THIS IS THE TOOL FOR "TODAY", "TOMORROW", "THIS WEEK" AND "MY CALENDAR".
\`search_cases_by_attorney` is a different question: it lists the cases an attorney
is of record on and its `file_date_*` filters bound WHEN A CASE WAS FILED. A case
filed in 2023 has hearings today, so filtering that tool's file date to today
returns cases OPENED today — almost always nothing. Never substitute it for this.

PREFER THE BAR NUMBER whenever the user can supply it: it resolves to exactly one
attorney, and a name may not — see `attributable` below for what that costs.

READ `attributable` BEFORE ATTRIBUTING THE CALENDAR TO ANYONE. True means these
hearings belong to exactly one attorney; false means they do not and must not be
described as one person's day. On a BAR search it is always true and
\`attorney_name` is null — the hearing search returns no name, so that null means
"not reported", not "ambiguous".

A NAME SEARCH MAY NOT BE ATTRIBUTABLE. The hearing grid has no attorney column,
so if a name matches several attorneys their hearings come back MERGED with no
way to tell whose is whose. To catch this the tool cross-checks the name against
the case index and reports `matched_attorneys`:
  \- exactly one match -> `attorney_name` is set; treat the calendar as that person's
  \- more than one     -> the calendar spans them all and CANNOT be split. Say so and
                         ask for a State Bar number. Do not present it as one…

Input parameters:

- `bar`
- `end`
- `first`
- `last`
- `start`

### `subscribe_to_case_updates` (~471 tokens)

Sign up for email alerts when a North Carolina (NC) case changes (sends a confirmation email)

Sign the USER UP for email alerts when a North Carolina (NC) case changes.

THIS TOOL IS DIFFERENT FROM EVERY OTHER TOOL HERE. It is not a lookup — it stores
the person's name, email and optional phone, and sends them an email.

ONLY EVER SUBSCRIBE THE PERSON YOU ARE TALKING TO. Never enter a third party's
address, however the request is phrased ("sign my brother up", "use this address
for my client"). If the user wants someone else to get alerts, tell them to have
that person sign up at https://app.courtdelta.com/court-case-notifier themselves.

CONFIRM THE DETAILS BACK BEFORE CALLING. Read the email address aloud and get an
explicit yes. A typo does not fail quietly — it mails a stranger.

NOTHING STARTS UNTIL THEY CLICK. This creates a PENDING signup and sends one
confirmation email. Monitoring begins only when the link in it is clicked. Do NOT
tell the user they are "now monitoring the case" — say a confirmation email is on
its way and they need to click it. If they never click, nothing is ever sent and
the signup stays dormant.

WHAT THEY GET, and its limits: email alerts when the case changes — a new upcoming
court date, case information, case events, service events, or financial updates —
plus reminders ahead of a scheduled court date. Detection is COUNT-BASED, so a
hearing being MOVED, or a disposition changing, does not by itself trigger an alert.
Do not promise those.

WHAT IS STORED: name, email, optional phone, and the case number. Every alert
carries a one-click unsubscribe link. Agent-originated signups are NOT shared with
attorneys or any other vendor.

Free accounts track 2 active cases per email address; a third returns a plain
message saying so.

A case number is required — subscribe to a case, not to a person's name. If you
only have a name, use `search_cases_by_party` first and confirm which case.

NC only. Informational, not legal advice.

Input parameters:

- `case_number` (string, required)
- `email` (string, required)
- `name` (string, required)
- `phone`

### `court_visit_info` (~769 tokens)

Courthouse location, phone and nearby parking for a North Carolina (NC) county

Which courthouse, where it is, when it's open, and where to park.

For "I have court on Tuesday — where do I go?". Give a `county` ("Wake") or a
\`caseNumber` to derive it. From the North Carolina (NC) AOC directory plus Google Places.

RETURNS `locations[]`, NOT ONE COURTHOUSE. 19 counties have several venues and
picking one silently is a real way to send someone to the wrong building. Wake has a
Courthouse, a Justice Center AND a Clerk's office; Guilford has courthouses in
Greensboro and High Point, in different cities. `multipleLocations:true` means you
must disambiguate rather than assume.

TO PICK THE RIGHT ONE, USE THE CASE'S HEARING LOCATION. `lookup_court_case` returns
\`upcomingHearings[].location` (e.g. "Wake Co. Justice Center"), which usually names
the building. Match it against `locations[].name`, allowing for "Co." vs "County".
BUT DO NOT FORCE A MATCH: measured on real hearings, a third have `"No location"` at
all, and several use names that don't correspond to the directory —
"Buncombe Co. Judicial Complex" is the Buncombe County Courthouse,
"Alamance Co. JB Allen" is the Alamance County Courthouse. When it doesn't map
cleanly, SHOW THE OPTIONS and let the user choose. Guessing between Wake's Courthouse
and its Justice Center is exactly the wrong place to be confident.

HOURS ARE REAL — and watch for lunch closures. A value like "08:30-12:30, 13:30-17:00"
means the venue SHUTS between those times; someone arriving at 1pm in Nash, Wilson,
Cherokee or either Guilford courthouse finds a locked door. Say the closure out loud.
Courts also close on NC state holidays, which these hours do not encode.

\`parkingAttributes` are what the venue publishes — "freeLot", "paidGarage",
"onSite" etc. ABSENT MEANS NOT CLAIMED, NOT "no parking". `nearbyParking` (actual
lots near the building, with `distanceMeters` and a `mapsUrl`) and `parkingMapUrl`
(a static map image, courthouse marked "C") appear on AT MOST ONE location — the one
the scrape described. Their absence o…

Input parameters:

- `caseNumber`
- `county`

### `check_expunction_options` (~2617 tokens)

Which North Carolina (NC) expunction statute and petition form fit a case

Which expunction statute and AOC petition form fit how each charge ended.

Reads the case's actual per-charge dispositions and routes each one to the statute(s)
that cover that outcome, with the petition and instruction-sheet links, where to file,
and the fee. Call with no `caseNumber` to get the whole statute table.

CHECK `automaticExpunction` FIRST AND LEAD YOUR ANSWER WITH IT. Under G.S.
15A-146(a4), a case where EVERY charge was dismissed without leave, dismissed by the
court, or ended in a not-guilty/not-responsible finding — all disposed on or after
12/01/2021, with no felony dismissed pursuant to a plea agreement — is expunged BY
OPERATION OF LAW. NOTHING IS FILED. No petition, no form, no fee.

When `applies` is true, the correct answer to "what do I file?" is "nothing". Do NOT
lead with the petition forms; sending someone to a clerk with a $175 fee discussion
when the charges expunge themselves for free is a wrong answer. The petition routing is
the fallback if the automatic expunction does not in fact occur.

THE TIMING DEPENDS ON `regime`, AND THE WINDOW IS NOT ALWAYS AVAILABLE. Automatic
expunction has been through three implementations, so read `regime` before quoting any
date, and check `windowDeterminable` before using `windowOpens`/`windowCloses`:

  "current"  — the 180-210 day rule. `windowOpens`/`windowCloses` are populated: say
               "it happens on its own between <windowOpens> and <windowCloses>".
  "original" — disposed 12/01/2021-07/31/2022, when the programme ran immediately with
               no delay. Windows are NULL. Say it should ALREADY have happened.
  "backlog"  — disposed during the statutory suspension (08/01/2022-07/01/2024). Windows
               are NULL. NCAOC had until 07/01/2025 to clear the backlog. Say that, and
               that a case still showing is a question for the clerk.
  "pre_a4"   — outside the subsection; `applies` is false anyway.

NEVER invent a window when `windowDeterminable` is false. A fabric…

Input parameters:

- `caseNumber`
- `convictionCount`
- `felony` (boolean)

### `estimate_license_points` (~1134 tokens)

Estimate North Carolina (NC) driver's-licence points for traffic charges

Driver's-licence points under G.S. 20-16(c) — a COMPARATOR, not a lookup.

Returns what each possible outcome would cost: convicted as charged, reduced to
improper equipment, prayer for judgment, or dismissed. That comparison is the useful
answer; a single number is not. Fast — no court-portal request.

LICENCE POINTS ONLY. Insurance (SDIP) points are a SEPARATE system with different
values, set by the Rate Bureau rather than statute, and are NOT included. If someone
asks what a ticket will do to their premium, say this tool doesn't cover that.

THE PJC SCENARIO'S ZERO HAS TWO EXCEPTIONS and you must state them. Under
G.S. 20-4.01(4a) a prayer for judgment counts as a CONVICTION — so it does carry
points — if it is the THIRD OR SUBSEQUENT PJC within any five-year period, or for ANY
PJC where the driver holds a CDL or the offence was in a commercial vehicle. Prior PJC
history is not in court records here, so the 0 assumes neither applies.

\`unmatched[]` LISTS CHARGES THAT COULD NOT BE SCORED — always mention them. The
schedule has a real "All other moving violations = 2" row, so a charge that matched
the catch-all (`viaCatchAll: true`) and one we failed to classify are different
things; do not let a total silently omit either.

Non-Chapter-20 charges score nothing at all — a drug or assault charge is not a
traffic offence and gets no points. Non-moving violations (improper equipment,
parking, inspection, registration, adult seat belt) are 0, which is why "reduce to
improper equipment" is the standard outcome people seek.

SPEEDING TURNS ON ABSOLUTE SPEED, not how far over the limit: the schedule row is
"speeding in excess of 55 mph = 3". 50-in-a-45 is 2, not 3. Pass `actual_speed` when
known — without it a speeding charge cannot be scored and lands in `unmatched`.

POINTS ARE NOT THE WHOLE CONSEQUENCE OF A SPEEDING CONVICTION. Check
\`excessiveSpeedingSuspension` and report it whenever it applies. G.S. 20-16.1(a)
mandates a 30-DAY LICENCE SUSPENSION, imposed by the D…

Input parameters:

- `charges` (array, required)
- `commercialLicense` (boolean)
- `outOfStateLicense` (boolean)
- `priorPoints`
- `recentlyReinstated` (boolean)

### `check_traffic_charge` (~1561 tokens)

Check whether a North Carolina (NC) traffic charge requires a court appearance

"Do I have to go to court for this ticket?" — answered from the citation itself.

For someone holding a paper North Carolina (NC) citation, BEFORE their case is searchable. Returns
waiver eligibility per charge (waivable / mandatory / conditional) plus how to ask
for a reduction or dismissal. FAST — no court-portal request, unlike the other tools.

THE OUTPUT IS OPTIONS WITH CONSEQUENCES, NOT A RECOMMENDATION. Waiving is a guilty
plea to the charge as written (an admission of responsibility on an infraction);
requesting a reduction asks the District Attorney to change the charge before any
plea; the two are alternatives. Relay them as choices for the person to make, and
never tell them which to pick.

TIMING IS PART OF THE ANSWER, NOT A DETAIL. Both routes have to be completed BEFORE
THE CASE IS CALLED, not merely on or before the court date — once the calendar reaches
it the clerk is working a courtroom docket, and nothing pauses the hearing. Read
\`citationOptions.state` before saying anything about appearing:

  "lastDay"        the court date is TODAY. It can still be settled with the clerk,
                   but only before the case is called, and there is NO time left to
                   file online — do not offer Guide & File. If the clerk cannot be
                   reached in time, the person should go to court.
  "noCourtDate"    no upcoming hearing, OR today's has already been called. Do NOT
                   assert a failure to appear — you cannot see the courtroom and they
                   may have attended that morning. Say: if they already went, this
                   does not apply; if they missed it, contact the Clerk of Superior
                   Court, because a missed date can become an FTA.
  "mandatory" | "conditional" | "onlineWaivable" | "inPersonWaivable"  as before.

NEVER REPORT "no appearance needed" ON "lastDay" OR "noCourtDate", however many of
the individual charges come back `waivable`. Missing a court date on a Chapter 20
ca…

Input parameters:

- `charges` (array, required)
- `county`
- `court_date`

### `screen_names_by_party` (~579 tokens)

Screen up to 5 people for North Carolina (NC) court cases (counts only)

Triage a SHORT list of people for North Carolina (NC) court cases.

Built for the "here is a list of names, which ones have cases?" question — a CSV of
applicants, tenants, or bond clients. **This server cannot accept file uploads:** read
the file yourself and pass the names as an array.

Returns COUNTS AND FACETS PER NAME, not case detail — `matched`, `case_count`,
\`counties`, `case_types`, `case_numbers` (first few), `portal_truncated`. That keeps a
5-name response readable. Once you know which names are interesting, call
\`search_cases_by_party` (full rows) or `lookup_court_case` (one case) on those.

LIMITS, and why they are low: each name runs a LIVE portal search, and the upstream
session token is shared by every user of this service — a wide fan-out risks blocking
it for everyone. Max 5 names per call, 3 at a time. Split a longer list across calls.

SLOW BY NATURE: measured ~60s for 3 names and ~2 minutes for 5. Tell the user you're
checking and roughly how long it takes; don't retry on a slow response, and don't
treat the wait as an error. If your client's timeout is tight, send fewer names.

PARTIAL RESULTS ARE NORMAL: one name failing (portal hiccup, timeout) does not fail
the batch — that entry comes back with an `error` and the rest still return. Report
which names were checked and which weren't; never present a failed name as "no cases
found", because those mean completely different things.

\`portal_truncated: true` on a name means the portal hit its statewide 200-case cap, so
that person's count is a LOWER BOUND — narrow with `county`, `case_status`, or a filed
date range and re-run that name.

Dates: ISO `YYYY-MM-DD` or `MM/DD/YYYY` — both accepted. `file_date_*` bounds when
the case was FILED, not when a hearing is scheduled.

Matching is exact on last + first name (no soundex here — it broadens results and
would make a screening list noisier). A common name will match multiple different
people; `case_count` is "cases matching this name", NOT "cases…

Input parameters:

- `case_status`
- `county`
- `file_date_end`
- `file_date_start`
- `names` (array, required)

### `search_judgments` (~2275 tokens)

Search North Carolina (NC) money judgments and criminal sentences (incl. aliases)

Search North Carolina (NC) money judgments and criminal sentences by party name.

REQUIRES AT LEAST ONE OF `party`, `case_number`, `alias` OR `from_date`. The other
arguments are FILTERS, not searches — `county` or `judgment_type` alone is rejected,
and so is a call with no arguments at all.

This is the JUDGMENT index, NOT the case index. A judgment is what a court
ENTERED on a case — a money judgment against someone, or a criminal sentence.
Use this for "does X have a judgment against them", "how much do they owe on
it", "is it still active", "find liens/judgments before I lend or rent".
For the case itself — charges, hearings, next court date, parties, service —
use `search_cases_by_party` (by name) or `lookup_court_case` (by number).
Every row carries `case_number`: that is the handoff key into
\`lookup_court_case` when the user wants the underlying case.

IT CARRIES REAL PROPERTY LIENS, WHICH IS NOT OBVIOUS. NC files these as "Civil
Misc. Judgment" records on the judgment docket, so this index — not the case
search — is where they live. `cause_of_action` on each row says which kind, and
the values seen in production include:

    CV - Claim of Lien              (G.S. 44A claim of lien on real property)
    CV - Federal Tax Lien           CV - NC Certificate of Tax Liability
    CV - Lien                       CV - Employment Security Comm Lien
    CV - Institutional Lien (Hospitals)
    CV - Lis Pendens                (pending action against the property)
    CV - Transcript of Judgment     (a judgment docketed from another county)
    CV - Summary Ejectment, CV - Money Owed, CV - Possession,
    CV - Collection on Account, CV - Other, FAM - Divorce, ...

So "are there any liens against this person?" is answerable HERE, and answerable
well: this index has no 200-cap, so a clean search really does mean none found.

DO NOT FILTER TO "lien" TO ANSWER "ARE THERE ANY LIENS?" — that under-reports badly.
A money judgment docketed with the clerk is ITSELF a lien on the…

Input parameters:

- `alias`
- `case_number`
- `cause_of_action`
- `county`
- `detail`
- `from_date`
- `judgment_type`
- `limit` (integer)
- `party`
- `sentence_type`
- `sort` (string)
- `to_date`

### `list_cases_filed` (~801 tokens)

List North Carolina (NC) court cases filed by case type, county and date

What was FILED — every case of a given type in a county over a date range.

Answers "what IF cases were filed in Surry County yesterday?", "show me the estate
cases opened in Wake this week", "how many civil suits were filed in Mecklenburg on
Monday?". This is the DOCKET axis. The other searches are name axes — use
\`search_cases_by_party` / `_business` / `_attorney` when you know WHO, and this when
you know WHAT and WHEN.

EVERY ROW NOW CARRIES `case_status`, with no `enrich` needed — so do not call
\`lookup_court_case` merely to find out whether a case is open or closed.
The returned text is FINER-GRAINED than the four filter values: alongside "Pending"
and "Disposed" you will see "Disposed - Voluntary Dismissal", "Disposed - Dismissal
on Order of the Court", "Disposed - Clerk of Superior Court" — i.e. HOW it ended, not
just that it did. So never test it with equality against the filter vocabulary
(`status == "Disposed"` misses most disposed rows); match on a prefix, and quote the
portal's own wording when you report it.

\`date_start`/`date_end` are the **FILED** date, not a hearing date. A case filed in
2023 can have a hearing today — for "who is in court today", use
\`get_attorney_hearing_calendar`. Accepts YYYY-MM-DD, or the words "today" and
"yesterday" (resolved in North Carolina (NC) time).

\**Defaults to YESTERDAY, not today**, when no date is given, and says so in
\`date_note`. Today's filings are still being keyed in by clerks, so a "today" answer
is a partial set that reads like a complete one.

\**`case_type` is a case-number PREFIX, not a type code.** `CR` also returns `CRS`;
\`CV` also returns `CVD` and `CVM`. Read `case_type_breakdown` before reporting a
count as "42 CR cases" — some of them may be CRS.

Common types: `IF` infraction (traffic), `CR`/`CRS` criminal, `CV`/`CVD`/`CVM` civil,
\`E` estate, `SP` special proceeding, `M` civil misc. judgment (liens, lis pendens).

\**Completeness.** The portal caps a search at 200 cases; this splits the query by
da…

Input parameters:

- `case_status`
- `case_type` (string, required)
- `county`
- `date_end`
- `date_start`
- `limit` (integer)
- `offset` (integer)

### `check_court_scam` (~894 tokens)

Check whether a North Carolina (NC) court-payment demand is a scam

Is this court-payment demand a scam? Assesses a contact someone received against
known North Carolina (NC) court-scam patterns.

Use this when someone describes being contacted about jury duty they missed, unpaid
court costs, a warrant, or a bond — and being asked to pay. Gather what they can tell
you and pass it in; every field is optional, and a partial description still gets an
assessment.

THE ASSESSMENT IS DETERMINISTIC, NOT A JUDGEMENT CALL. Upstream rules decide the
severity; you are not being asked to estimate risk yourself. Report what comes back.

\**`severity` 2 = "Matches known scam patterns" (LIKELY SCAM).** A payment method NC
courts never accept, a jury-duty demand above the $50 statutory penalty, or a cold
contact that also carries a payment demand or arrest threat.

\**`severity` 1 = "Matches some known scam patterns" (USE CAUTION).**

\**`severity` 0 does NOT mean the contact is legitimate.** It means none of the
patterns this tool checks for were present in what was described. Say exactly that —
never "this looks legitimate", never "you're fine". Someone reading a false all-clear
may send money. The safe next step is always to verify independently through the
court, using a number they look up themselves.

Pass the ids listed in the parameter types verbatim — they are a fixed vocabulary.
\`behavioral_flags` accepts any of: threatened_immediate_arrest, claimed_to_be_official,
used_target_personal_details, spoofed_caller_id, gave_callback_number,
pressured_to_stay_on_line, asked_to_stay_on_phone_during_purchase,
requested_ssn_or_financial_info, transferred_to_supervisor_or_clerk,
background_noise_office_or_radio, asked_to_meet_in_person, after_hours_contact,
demanded_secrecy.

\`raw_description` is anything else they were told, in their own words. It is used for
the assessment and to derive category tags; the text itself is not stored.

IF THEY GAVE A CASE OR CITATION NUMBER, `caseLookup.status` comes back `"pending"` —
this tool does not fetch the reco…

Input parameters:

- `amount_demanded`
- `behavioral_flags`
- `case_or_citation_number`
- `claim_type`
- `contact_channel`
- `county`
- `payment_method_requested`
- `raw_description`

### `court_delta_help` (~123 tokens)

What Court Delta can do (capabilities + example questions)

What this Court Delta server covers, with example questions.

Call this ONLY when the user asks what this server / connector can do, what data it
has, or how to use it. It is NOT a step toward answering a court question — if the
user asked about a case, a citation, a person, or a bond, skip this and call
\`lookup_court_case` / `search_cases_by_party` directly. Calling this first just
delays their answer.

Takes no arguments. Returns static text; makes no court-portal request.

### `search_statutes` (~267 tokens)

Search North Carolina (NC) statutes by topic or keyword

Search North Carolina (NC) statutes by topic, keyword or phrase.

Use this when you know the SUBJECT but not the citation — "what's the NC law about
leaving a dog in a hot car", "failure to appear penalty", "when can I expunge a
misdemeanor". If you already have a citation, use get_statute instead.

Returns ranked sections with highlighted fragments showing why each matched, not full
text: pick the one you want and call get_statute for it.

Supports quoted "exact phrases", -excluded terms and `or`. Court shorthand is expanded
automatically and case-insensitively — FTA, DWLR, PJC, AWDW and similar become the
statutory wording, because the statute book spells the phrase out and never uses the
abbreviation. The expansion is reported back as `expanded_query`.

Searches the law in force today, at section level. A low top rank means the corpus
probably has no section on point — NC simply has no statute on some subjects, and
saying so is a better answer than the nearest loose word match.

Input parameters:

- `chapter`
- `include_repealed` (boolean)
- `limit` (integer)
- `query` (string, required)

### `get_statute` (~187 tokens)

Read a North Carolina (NC) General Statutes section

Full text of one North Carolina (NC) General Statutes section, by citation.

Use for "what does G.S. 14-72.1 say". Accepts any spelling — "14-72.1", "G.S. 14-72.1",
"§ 14-72.1". Returns catchline, body, history note, and when it was first enacted and
last amended. `as_of` gives the text observed on a past date; `pending` lists variants
enacted but not yet effective.

Section-level only — ask for "20-141", not "20-141(j1)". For WHEN it changed use
amendment_history; for WHAT changed use diff_statute.

Input parameters:

- `as_of`
- `citation` (string, required)
- `max_chars` (integer)
- `pending` (boolean)

### `pending_changes` (~145 tokens)

North Carolina (NC) statute changes enacted but not yet effective

North Carolina (NC) statute text already enacted but not yet effective.

Use for "what changes to Chapter 14 are coming". Returns each section's current text
alongside the future variant, its effective date, and by default a diff of the two.
Distinguishes an AMENDMENT (current text exists) from a NEW SECTION (nothing in force
yet, so no diff).

Only counts variants dated in the future. For text in force now use get_statute; for
already-enacted history use amendment_history or recent_law_changes.

Input parameters:

- `chapter`
- `citation`
- `include_diff` (boolean)
- `limit` (integer)

### `amendment_history` (~131 tokens)

When a North Carolina (NC) statute was enacted and amended

When a North Carolina (NC) statute section was enacted and every time it was amended.

Use for "how often has G.S. 14-33 changed" or "when was this last amended". Returns one
entry per session law mined from the section's own history note, grouped by year, plus
first-enacted year and total amendment count.

These are STATUTORY dates from the legislature's record — not when this database saw
the text change. For that use recent_law_changes; for the wording itself use
get_statute or diff_statute.

Input parameters:

- `citation` (string, required)

### `diff_statute` (~158 tokens)

Diff two versions of a North Carolina (NC) statute

Word-level diff of a North Carolina (NC) statute section between two versions.

\`mode="pending"` compares the text in force against an enacted-but-not-yet-effective
variant — use this for "what will change on 1 October". `mode="observed"` compares
versions this database has actually recorded, optionally between two dates.

CANNOT show text from before the ingest's first observation: observed history begins
then, so most sections have only one version and return diff: null. For earlier change
dates use amendment_history; for pending text use pending_changes.

Input parameters:

- `citation` (string, required)
- `format` (string)
- `from_date`
- `mode` (string)
- `to_date`

### `recent_law_changes` (~146 tokens)

Recently changed North Carolina (NC) statutes

Recently changed North Carolina (NC) statutes, by date or year.

Two sources, both returned by default. STATUTORY is the legislature's record from each
section's history note and reaches back decades — use it for "what passed in 2025".
OBSERVED is when this database saw ncleg.gov text change, and only covers the period
since its first ingest run.

The initial corpus load is excluded from observed results unless
include_baseline=true. For one section use amendment_history.

Input parameters:

- `chapter`
- `include_baseline` (boolean)
- `limit` (integer)
- `since` (string, required)
- `source` (string)

### `chapter_activity` (~119 tokens)

Legislative activity across a North Carolina (NC) statute chapter

How much legislative churn a North Carolina (NC) statute chapter has seen.

Use for "which parts of Chapter 14 keep changing". Returns amendment counts by year,
the most-amended sections with their totals, and counts of pending and repealed
sections. Omit `chapter` for a corpus-wide view.

Counts are STATUTORY, from history notes — not observations. For one section use
amendment_history; for upcoming text use pending_changes.

Input parameters:

- `chapter`
- `since_year`
- `top` (integer)

### `cross_references` (~146 tokens)

What a North Carolina (NC) statute cites, and what cites it

Which North Carolina (NC) statutes this section cites, and which cite it.

Use for "what does G.S. 14-72.1 depend on" or "what else references it". OUTBOUND is
what the section's own text cites; INBOUND is every section citing it — the direction
you cannot get by reading one statute.

Section-level only: a reference to 20-141(j1) is an edge to 20-141. Chapter-wide and
"this Article" references are not edges. For the text itself use get_statute.

Input parameters:

- `citation` (string, required)
- `direction` (string)
- `limit` (integer)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-courtdelta-court-delta/mcp#diagnostics

## Score history

- 2026-09-28: 67
- 2026-09-27: 67
- 2026-09-26: 66
- 2026-09-25: 66
- 2026-09-24: 65
- 2026-09-23: 65
- 2026-09-22: 65
- 2026-09-21: 64
- 2026-09-20: 64
- 2026-09-19: 63
- 2026-09-18: 63
- 2026-09-17: 62
- 2026-09-16: 62
- 2026-09-15: 61
- 2026-09-14: 61
- 2026-09-13: 60
- 2026-09-12: 60
- 2026-09-11: 60
- 2026-09-10: 59
- 2026-09-09: 58
- 2026-09-08: 58

## Common questions

### What is the Court Delta MCP server?

Court Delta is an MCP server listed in the public MCP registry as com.courtdelta/court-delta. Look up North Carolina court cases, citations, judgments & hearings; search by name; scam check. This page covers its hosted endpoint (https://mcp.courtdelta.com/mcp).

### Is the Court Delta MCP server safe to use?

Court Delta scores 67 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Court Delta MCP server expose?

Court Delta exposes 23 tools: lookup_court_case, search_cases_by_party, search_cases_by_attorney, search_cases_by_business, get_attorney_hearing_calendar, and 18 more. Their descriptions and schemas cost roughly 20,132 tokens of context every time the server is loaded.

### Does the Court Delta MCP server require authentication?

No. We connected to Court Delta without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Court Delta MCP server still maintained?

Court Delta is still listed as active in the MCP registry. We last reached this channel on 28 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.courtdelta.com/mcp
- Website: https://app.courtdelta.com/mcp
- Changelog RSS feed: https://verifymcp.io/servers/com-courtdelta-court-delta/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-courtdelta-court-delta/mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-courtdelta-court-delta/mcp
