Skip to main content
Glama

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

estimate_license_points
Read-only

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 Division without a preliminary hearing, on conviction of either (i) more than 15 mph over the limit while ALSO above 55 mph, or (ii) any speed above 80 mph. This is separate from and additional to points. An 85-in-a-65 is only 3 points but ALSO costs the licence for 30 days — reporting the 3 alone is a true number that leaves a false impression. Pass speed_limit as well as actual_speed: without the limit, branch (i) cannot be assessed and the tool abstains (determinable: false) rather than implying there is no suspension.

That suspension attaches only ON CONVICTION, so a reduction, PJC or dismissal avoids it — which is usually the single biggest factor in the comparison, bigger than the points.

G.S. 20-16.1(b)(1): on a FIRST conviction only, the trial judge "may when feasible" allow a limited driving privilege for purposes reasonably connected with the HEALTH, EDUCATION AND WELFARE of the person convicted and their family. There is no listed "work" privilege — employment is commonly argued under welfare, so do not describe it as a work privilege as though the statute named one. The permit is valid for 30 days from issuance and the judge may restrict days, hours, vehicle types and routes.

THIS TOOL CANNOT TELL WHETHER IT WOULD BE A FIRST CONVICTION — prior convictions are not in the record, so the seven-year look-back cannot be applied. The privilege is discretionary and conditioned on feasibility. Answer "you can ask the court", never "yes, you will get one". Do NOT import limited-privilege rules from the DWI statute (G.S. 20-179.3); there is no "hard suspension period" concept in G.S. 20-16.1.

SUSPENSION FOR ACCUMULATED POINTS is a different mechanism again, with TWO thresholds (G.S. 20-16(a)(5)): 12 points in three years, and 8 in the three years after a licence is reinstated. Pass priorPoints and recentlyReinstated if the user knows them — neither is in any court record, so without them no suspension assessment is made.

Set commercialLicense or outOfStateLicense and the tool REFUSES rather than guessing: a separate, higher schedule applies to CDL holders, and an out-of-state conviction is assessed by the licensing state under the Driver Licence Compact.

Informational, not legal advice. Whether a reduction or PJC is actually available is a decision for the District Attorney and the court.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
chargesYes
priorPointsNo
commercialLicenseNo
outOfStateLicenseNo
recentlyReinstatedNo

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. First observed

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only declare readOnlyHint and openWorldHint; the description adds substantial behavior beyond them — refusal rather than guessing for CDL/out-of-state, determinable:false abstention without speed_limit, the two PJC exceptions to a zero, the unmatched[]/viaCatchAll distinction, and the mandatory 30-day suspension that is separate from and additional to points.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded (what it is, then the comparator framing) and uses caps to flag must-report items, but the text is very long and includes material tangential to invoking the tool — the limited driving privilege paragraph and the DWI-statute caution are output-narrative rather than call guidance. Much earns its place, yet the volume is heavier than needed to select and call the tool correctly.

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?

An output schema exists, so return values need not be explained, and the description still covers the behavioral edges an agent needs: refusals, abstentions, unmatched handling, catch-all vs unclassified charges, and the suspension/points distinction. Nothing needed to invoke it correctly is missing.

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?

With top-level schema description coverage at 0%, the description carries the full burden and does: it explains what priorPoints and recentlyReinstated feed (the two G.S. 20-16(a)(5) thresholds), what commercialLicense/outOfStateLicense trigger (refusal), and why actual_speed and speed_limit are jointly required for the suspension branch. This is meaning well beyond the bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource ('Estimate driver's-licence points under G.S. 20-16(c)') and frames it sharply as 'a COMPARATOR, not a lookup', which tells the agent what the output means. It also distinguishes its scope from the insurance/SDIP system and from accumulated-point suspension. The one gap is that it never names or differentiates itself from the sibling check_traffic_charge, whose relationship to this tool is left ambiguous.

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?

It gives explicit when-to-use and when-not guidance: pass actual_speed for speeding charges or they land in unmatched, pass speed_limit or branch (i) cannot be assessed and the tool abstains, pass priorPoints/recentlyReinstated only if the user knows them. It also states the refusal conditions (commercialLicense/outOfStateLicense) and the limits (cannot determine first-conviction status, cannot assess SDIP premiums).

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