Skip to main content
Glama

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

check_traffic_charge
Read-only

"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 case means an order for arrest and a G.S. 20-24.1 revocation that lasts until the charge is actually disposed. howToRequest already carries the right wording for every state — relaying it verbatim is the safe move.

IF THE USER HAS A CASE NUMBER, USE lookup_court_case INSTEAD. It runs these same rules on the real charges and also gives the court date and the amount owed. This tool is for when there is no case number yet.

THE STATUTE DRIVES THE ANSWER. Pass the G.S. number printed on the citation (e.g. "20-141(J1)", "G.S. 20-127(D)"). Without a parseable statute a charge cannot be classified — ask the user to read the "G.S." line off their citation rather than guessing from the offense name. unclassified lists any charge that fell through.

PASS EVERY CHARGE ON THE CITATION, not just the one asked about. Eligibility is computed ACROSS the citation: one mandatory charge forces an appearance for all of them. Reporting on a single charge in isolation gives the wrong answer — a real Wake case has two waivable charges and one DWLR, and the correct answer is "you must appear".

viaCompanionCharge: true on a charge means exactly that: it would be waivable on its own, but AOC mandatory-appearance item #39 makes every violation on a citation mandatory once ANY violation on it is. Never tell someone they can pay such a charge off separately or handle it by mail — the whole citation must be appeared on. Say which charge is forcing it, since that is usually the one they want to ask the District Attorney about.

SPEED CHANGES THE ANSWER. With no charged speed a speeding charge comes back conditional, not waivable: over 80 mph, or more than 15 over while over 55, is mandatory. Pass actual_speed/speed_limit if known — or just pass the offense line verbatim ("SPEEDING 85 IN A 65"), which is parsed for the speed.

PASS offense VERBATIM FROM THE CITATION for every charge, not a paraphrase. A few rules cannot be decided from the statute number alone and are read off the offense text: texting is waivable UNLESS it was while operating a school bus, and a registration or title violation is waivable UNLESS it involves stolen, altered or fictitious plates or certificates. Both statutes are the same either way, so a paraphrase that drops "school bus" or "fictitious" silently turns a mandatory appearance into "waivable". If the user summarises rather than quotes, ask for the exact wording on the citation before answering.

county (optional) decides the reduction path: participating counties get NC's online Guide & File link, others get the in-person District Attorney route.

PASS court_date WHENEVER THE CITATION SHOWS ONE (YYYY-MM-DD), AND PASS THE REAL ONE. Without it the answer assumes there is no upcoming hearing and comes back as "contact the Clerk of Superior Court" instead of the resolution options — an open citation with no court date often means a failure to appear has already happened. It also unlocks reductionSubmitBy: NC's online reduction request must be filed SEVERAL BUSINESS DAYS BEFORE the court date, so without the date that cutoff is silently missing rather than reported.

The date is read against the Eastern-time clock, so it changes the answer in both directions: a date already past — INCLUDING EARLIER THE SAME DAY — returns "noCourtDate", and a date that is TODAY returns "lastDay". Guessing or rounding the date is therefore not a harmless approximation; it is how someone gets told a ticket is cleanly waivable on the morning of their hearing.

citationOptions.reduction is a PRE-SCREEN, never an eligibility verdict. Each gate is pass / fail / unknown, and unknown means the court record cannot decide it — report it as unknown, never as a disqualification. Four of the program's criteria (age 18+, valid NC licence, non-CDL, NCDMV compliance on a companion charge) are not in court data at all and come back in userMustConfirm for the person to check. The 10-19 mph band and the 80 mph ceiling are AOC / District Attorney PROGRAM CRITERIA, not statute — never attach a G.S. citation to them. The District Attorney decides whether to offer a reduction.

A null citationOptions means these are NOT waivable-citation charges — either not NC Chapter-20 traffic, or a serious criminal charge (impaired driving, death by vehicle, eluding) or a felony, where "it's just a ticket" framing is wrong. Say that plainly; do not present it as "no appearance required".

General guidance for the charges given, NOT a lookup of any real case, and not legal advice. amountDue is always null here — there is no case to read a balance from.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
countyNo
chargesYes
court_dateNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • changedInput schema / properties / charges / items / description
      Previous value: -"One charge off a citation. `statute` is what actually drives the answer.\n\nFor a speeding charge pass BOTH `actual_speed` and `speed_limit`. Points key off the\nabsolute speed, but the mandatory 30-day suspension in G.S. 20-16.1 also has a\n\"more than 15 mph over the limit\" branch that cannot be evaluated without the limit."New value: +"One charge off a citation. `statute` is what actually drives the answer.\n\nFor a speeding charge pass BOTH `actual_speed` and `speed_limit`. Points key off the\nabsolute speed, but the mandatory 30-day suspension in G.S. 20-16.1 also has a\n\"more than 15 mph over the limit\" branch that cannot be evaluated without the limit.\n\nSPEEDS AND FLAGS ACCEPT EITHER A NUMBER OR A STRING. They were `str`-only, and callers\nkept sending `speed_limit: 65` — the obvious thing to do, since a speed limit is a\nnumber — which pydantic rejected outright:\n\n    1 validation error for call[check_traffic_charge]\n    charges.0.speed_limit  Input should be a valid string [input_value=65]\n\nThat is a wasted round-trip for something the server can trivially normalise, and no\namount of documentation fixes it: the caller has to already know a number must be\nquoted. `_normalise_charge` stringifies on the way to the upstream, which wants text."
    • addedInput schema / properties / charges / items / properties / actual_speed / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "number"
      +  }
      +]
    • removedInput schema / properties / charges / items / properties / actual_speed / type
      Removed value: -"string"
    • addedInput schema / properties / charges / items / properties / construction_zone / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "boolean"
      +  }
      +]
    • removedInput schema / properties / charges / items / properties / construction_zone / type
      Removed value: -"string"
    • addedInput schema / properties / charges / items / properties / school_zone / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "boolean"
      +  }
      +]
    • removedInput schema / properties / charges / items / properties / school_zone / type
      Removed value: -"string"
    • addedInput schema / properties / charges / items / properties / speed_limit / anyOf
      Added value: +[
      +  {
      +    "type": "string"
      +  },
      +  {
      +    "type": "integer"
      +  },
      +  {
      +    "type": "number"
      +  }
      +]
    • removedInput schema / properties / charges / items / properties / speed_limit / type
      Removed value: -"string"
  2. Changed1 schema field changed
    • addedInput schema / properties / court_date
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null
      +}
  3. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations only cover readOnlyHint/openWorldHint, but the description adds rich behavioral context: that output is 'options with consequences, not a recommendation,' the mandatory-appearance cross-charge rule (viaCompanionCharge), FTA/order-for-arrest consequences, timing semantics ('lastDay', 'noCourtDate'), the pre-screen vs. verdict distinction for reductions, and speed-dependent classification. This is exceptional disclosure beyond what annotations 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?

Long, but the length is justified by the tool's complexity and the high-stakes nature of the answer. Front-loaded with the core question, then organized into clear blocks (timing, statute, charges, speed, county, court_date, pre-screen caveats). Slightly overlong with some repetition (e.g., timing warnings appear multiple times).

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 the complexity (cross-charge eligibility, state-specific timing rules, pre-screen semantics) and the fact that an output schema exists but the description still explains the meaning of key fields ('lastDay', 'noCourtDate', 'viaCompanionCharge', 'userMustConfirm'), the description is complete enough for an agent to invoke and interpret correctly. It even covers failure modes (unclassified charges, null citationOptions).

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

Parameters5/5

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

Schema description coverage is 0%; the description fully compensates. It specifies that `statute` must be the G.S. number printed on the citation (with examples), that `offense` must be passed verbatim (with the school-bus/fictitious-plate rationale), that `court_date` must be the real date in YYYY-MM-DD and that omitting it silently loses `reductionSubmitBy`, that `county` decides the reduction path, and that `actual_speed`/`speed_limit` drive classification. Every parameter gets concrete semantics beyond the bare schema.

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 ('check whether a NC traffic charge requires a court appearance') and names the sibling tool to use instead when a case number exists (lookup_court_case). The scope ('from the citation itself, BEFORE the case is searchable') sharply distinguishes it from the other tools.

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?

Explicit routing: 'IF THE USER HAS A CASE NUMBER, USE lookup_court_case INSTEAD.' Plus explicit conditions for when this tool is appropriate (no case number yet) and when not (has a case number). Also distinguishes from court-portal tools via 'no court-portal request, unlike the other tools.'

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.

Resources