Skip to main content
Glama

Server Details

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

Ownership verified
Status
Healthy
Uptime
100.0% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.5/5.0

Scored across 23 tools

Disambiguation4/5

The tools cluster into distinct families — statute research (get_statute, search_statutes, amendment_history, diff_statute, pending_changes, chapter_activity, cross_references), case lookup (party/business/attorney/judgment/filed/single-case), and advisory (traffic, expunction, scam) — and each description explicitly cross-references its nearest neighbor with 'use this when / use that instead' guidance. A few pairs still overlap closely at first glance (amendment_history vs recent_law_changes, diff_statute vs pending_changes, check_traffic_charge vs lookup_court_case), though the descriptions resolve them.

Naming Consistency4/5

Verb-prefixed families are consistent and predictable — search_*_by_* (party/business/attorney), check_* (scam/expunction/traffic), get_* (statute/calendar) — and everything is lower-case snake_case. A handful of noun-phrase names (amendment_history, court_visit_info, cross_references, court_delta_help) break the verb_noun pattern, but they read naturally and describe what they return. Minor deviations only.

Tool Count4/5

23 tools is above the typical well-scoped range, but the server's purpose is unusually broad: NC statutes, court-case search, traffic citations, expunction, scam awareness, courthouse logistics, and email subscriptions. Each tool carries a genuinely distinct responsibility and none is obviously redundant — even screen_names_by_party earns its place as a rate-limited batch variant. Slightly heavy, but every tool justifies its existence.

Completeness5/5

The statute side is a full lifecycle (search -> full text -> amendment history -> diff -> pending changes -> chapter activity -> cross-references), and the case side covers every practical lookup axis: party, business, attorney, filed-date docket, judgment index, single-case resolution, and hearing calendars. The only gaps — not reading scanned PDFs and not covering UCC filings — are explicitly acknowledged non-goals rather than omissions, and the toolset even includes the write path (email subscriptions) and a meta help tool.

Available Tools

23 tools
amendment_historyWhen a North Carolina (NC) statute was enacted and amendedA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
citationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

The description goes beyond the readOnlyHint annotation by explaining that results are mined from the section's own history note, grouped by year, and include first-enacted year and total amendment count. It also clarifies that these are statutory dates from the legislature's record, not database update dates, which is important behavioral context.

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?

The description is well-organized: purpose, usage examples, return summary, and sibling differentiation. The first sentence largely repeats the title, which is slightly redundant, but overall every paragraph earns its place and the most decision-relevant information is front-loaded.

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?

For a one-parameter read-only tool with an output schema, the description covers why to use it, what it returns, how results are derived, and which alternatives to use in related scenarios. Nothing critical is missing for an agent to select and invoke it correctly.

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

Parameters4/5

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

The schema only has a 'citation' string with no description coverage, so the description must compensate. It gives an explicit example format, 'G.S. 14-33', and explains the resource is an NC statute section, which is helpful. It could be more explicit about accepted citation variants, but the example supplies enough guidance for a single-parameter tool.

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?

The description clearly states the tool reports when an NC statute section was enacted and every time it was amended, with concrete example questions. It also differentiates itself from related tools such as recent_law_changes, get_statute, and diff_statute.

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 explicitly says to use this tool for questions like 'how often has G.S. 14-33 changed' or 'when was this last amended', and tells the agent to use recent_law_changes for database-observed changes and get_statute/diff_statute for wording. This is clear routing guidance.

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

chapter_activityLegislative activity across a North Carolina (NC) statute chapterA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNo
chapterNo
since_yearNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already supply readOnlyHint=true, and the description complements this by clarifying that counts are 'STATUTORY, from history notes — not observations' and by enumerating the return categories. This adds behavioral context beyond the structured hints, though it does not discuss pagination or exact limit behavior.

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

Conciseness5/5

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

The description is compact and front-loaded, with the core purpose in the first sentence. Every subsequent sentence earns its place: use case, return contents, chapter behavior, data provenance, and sibling alternatives. No filler or redundant restatement.

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

Completeness4/5

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

For a read-only aggregation tool with an output schema and no required parameters, the description is largely complete: it states scope, output summary, data semantics, and alternatives. The only gap is that top and since_year are not explicitly described, but their meaning is reasonably inferable and defaults make the tool callable without them.

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 0%, so the prose must explain parameters. It clearly explains chapter ('Omit chapter for a corpus-wide view') and links it to tool selection, but top and since_year are left to their names and defaults. The description partially compensates for the missing schema descriptions but not completely.

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?

The description opens by defining the tool's purpose: measuring 'legislative churn' at the North Carolina statute chapter level, and specifies what is returned (amendment counts by year, most-amended sections, pending/repealed counts). It also separates itself from siblings by naming amendment_history and pending_changes as the tools for single-section and upcoming-text needs.

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 a concrete use case ('which parts of Chapter 14 keep changing'), tells the caller to omit chapter for a corpus-wide view, and explicitly names alternatives: 'For one section use amendment_history; for upcoming text use pending_changes.' This is direct routing guidance with no reliance on inference.

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

check_court_scamCheck whether a North Carolina (NC) court-payment demand is a scamA
Read-only
Inspect

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 record. Call lookup_court_case with that number to check whether it is real, and read the two answers together: a demand referencing a case that does not exist is strong evidence of a scam, and a real case number does NOT make the payment demand legitimate (scammers cite real numbers).

Always surface facts (what NC courts actually do) and reporting (where to report). If they already sent money, point them to the FBI IC3 link in reporting. WHEN SEVERITY IS 1 OR 2, ASK THEM TO REPORT IT. ask_them_to_report carries the ask and the reason: reports are what show which scams are running in which NC counties right now, so the next person who checks gets a current warning. Their minute protects someone else. Make it an offer — if they decline, drop it. At severity 0 there is no such field and you must not ask, because nothing has been established as a scam. Every link you pass on — this one and the NCDOJ / FTC / IC3 ones — must keep its https:// prefix so it is clickable. reporting.court_delta.markdown is already formatted for that; use it verbatim rather than retyping the domain. reporting.court_delta.url is a scam-trend tracker, NOT a law-enforcement report — never present it as one, or as a substitute for the NCDOJ / FTC / IC3 routes.

Never asks for or transmits a name or phone number. A de-identified record — claim type, channel, county, payment method, flags, amount, severity — is stored so scam trends can be tracked. NC only. Informational, not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
countyNo
claim_typeNo
amount_demandedNo
contact_channelNo
raw_descriptionNo
behavioral_flagsNo
case_or_citation_numberNo
payment_method_requestedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint/openWorldHint annotations: it states the assessment is deterministic, explains that severity 0 does NOT mean legitimate, discloses that a de-identified record is stored, clarifies that no name or phone number is collected, and explains how severity 1/2 should trigger ask_them_to_report. No contradiction with annotations: the storage is internal trend tracking and the tool remains non-destructive to user data.

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?

The description is long but tightly packed with operational rules; it opens with the purpose and usage trigger, uses bold severity markers, and gives imperative handling instructions. A little redundancy exists (e.g., 'every field is optional' plus 'partial description still gets an assessment', and repeated 'never' cautions), but the length is justified by the safety-sensitive nature of scam triage.

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?

The description covers all needed context for safe invocation: optionality, severity interpretation, the severity-0 false-all-clear hazard, case-number interplay with lookup_court_case, reporting channels, ask_them_to_report behavior, link formatting, data storage/privacy, and NC-only scope. Even though an output schema exists, the description adds essential decision logic around those outputs, making it complete for an agent to invoke and relay results responsibly.

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

Parameters4/5

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

With schema description coverage at 0%, the description compensates by explicitly listing accepted behavioral_flags, defining raw_description as free-form text used for assessment/category tags but not stored, and explaining that case_or_citation_number yields a pending status requiring lookup_court_case. Other parameters such as county and contact_channel are not individually described, though their enum/string values are self-explanatory and all fields are optional, so the remaining gap is modest.

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?

The first line directly asks 'Is this court-payment demand a scam?' and the description begins with 'Assesses a contact someone received against known North Carolina (NC) court-scam patterns.' This names a specific verb, resource, and jurisdiction, and it clearly distinguishes this tool from siblings like lookup_court_case or search_cases_by_party by focusing on scam-pattern assessment rather than court record lookup.

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 trigger: '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.' It also states NC-only scope and instructs when to route to a sibling: 'Call lookup_court_case with that number to check whether it is real.' Combining two related tools is spelled out, and the warning that a real case number does NOT make the payment demand legitimate prevents misuse.

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

check_expunction_optionsWhich North Carolina (NC) expunction statute and petition form fit a caseA
Read-only
Inspect

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 and ". "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 fabricated past date is worse than saying the timing does not reduce to one — it tells someone a deadline passed when no deadline ever ran. The notes array already carries the right wording for each regime; prefer it to composing your own.

POINT AT THE CLERK IN THE COUNTY OF DISPOSITION, by name — it is in fileInCounty. Under G.S. 15A-151(a2) a clerk may not disclose an expunged record from any other county, so "ask the clerk" without naming which one sends people somewhere that cannot help them.

AN (a4) EXPUNCTION IS NARROWER THAN PEOPLE EXPECT, and both limits belong in your answer: G.S. 15A-150(b)'s requirement that the clerk notify other agencies does NOT apply to automatic expunctions, so other agencies may never learn of it and are not obliged to clear their own records; and under G.S. 15A-151(a1)/(a2) the record is not destroyed — it is retained by the clerk as a confidential file, with AOC holding electronic copies, still disclosable to the person, their attorney, the district attorney and the Appellate Defender. "Gone from the public index" is not "gone".

THIS IS THE ONE DETERMINATION THIS TOOL MAKES, and it is safe precisely because (a4) turns only on how the charges on THIS case ended — which the record shows in full — and not on anything person-level. determinable: false means the record could not answer (a charge with no disposition, an unrecognised disposition); say so rather than treating it as a "no".

EVERYTHING ELSE ROUTES. IT DOES NOT DECIDE ELIGIBILITY, and you must not present it as doing so. Three reasons, all of which belong in your answer when someone asks "can I get this expunged?":

  • Eligibility is PERSON-level. A disqualifying conviction anywhere bars relief, and this data cannot confirm identity — date of birth is rarely published and is masked to the year, and common names collide heavily.

  • A prior expunction can itself disqualify, and an expunged case is REMOVED from the court record — so the very thing that would disqualify someone is invisible here.

  • Some expunctions bar future ones, so which statute you petition under matters. The North Carolina (NC) Courts guidance is to consult an attorney about that choice.

"NOT YET ELIGIBLE" IS SAFE TO SAY when a waiting period plainly hasn't run — that is arithmetic. "Eligible" is never safe to say.

WAITING PERIODS come from G.S. 15A-145.5(c): 3 years for one nonviolent misdemeanour, 7 for more than one, 10 for one nonviolent felony, 15 for breaking or entering under 14-54(a), 20 for two or three felonies. THE DATE RETURNED IS THE EARLIEST POSSIBLE. The statute runs the clock from conviction OR from completion of any active sentence, probation or post-release supervision, WHICHEVER IS LATER — and completion dates are not in this record. Say the date is a floor, not a target.

waiting CARRIES TWO DATES. ALWAYS LEAD WITH earliestConservative, and NEVER quote earliestAlternative on its own when the two differ.

  • earliestConservative — the later, safer date. Lead with this.

  • earliestAlternative — the earlier date, ignoring any sentence. Labelled, never the headline.

  • clockRunsFrom — the date the arithmetic started. Equal dates (fine-only, or no supervision visible in the record) — give one date.

WHAT THE TWO DATES MEAN DEPENDS ON THE SUBSECTION, and only one of them is genuinely ambiguous:

  • 15A-145.5(c)(1)a (3 years, one nonviolent misdemeanour) reads "three years after the date of the conviction or when any active sentence, period of probation, or post-release supervision has been served, whichever occurs later." That admits two readings — later-of-the-two, or three-years-from-completion — and the School of Government flags it as unsettled. Here the alternative really is a second legal reading. A clerk may be applying either.

  • (c)(1)b, (c)(2)a, (c)(2)a1, (c)(2)b (7/10/15/20 years) read "N years after the date of conviction or N years after the sentence has been served, whichever later." SOG treats that as N years FROM COMPLETION. There is no second reading: the "alternative" is merely conviction + N with the sentence ignored, which is not a position anyone holds. Do not present it as a competing interpretation. In every case, if the record cannot show when probation or supervision ended — and it usually cannot — the true date may be LATER than either date printed. Say that.

THE YEAR COUNT IS NOT THE AMBIGUITY. S.L. 2025-71 cut the single-misdemeanour wait from five years to three for petitions filed on or after 09 July 2025, and this tool returns the current three. AOC-CR-298 (Rev. 1/23) still prints five — the form is behind the statute. Any "AOC-CR-298 takes the conservative reading" language in waiting.note refers to WHICH EVENT STARTS the clock, never to the number of years. Do not let the form drag the wait back to five.

reduced / reducedTo per charge: the charge was amended to a lesser offence before disposition, and reducedTo names it. Routing follows the charge AS ADJUDICATED, so a reduction can change the class, the waiting statute, and whether the (a4) felony-plea exception bites. Name the lesser offence, or the reader will think you scored the original line on their citation.

ONLY WHEN THE RECORD SHOWS THE LESSER. reduced: true with a named reducedTo means the disposed offence was actually resolved. A plea of "Responsible to Lesser" whose disposed statute never attaches is NOT that: abstain on routing rather than guessing which lesser offence was meant. Note also that conviction of a lesser does not expunge the greater charge without an express dismissal of it.

family per charge: "dismissed", "acquitted", "convicted", "pjc", or "unknown". Treat each differently:

  • dismissed + withLeave: true → the State may still REINSTATE the charge. Flag it, and note it also defeats automatic expunction under (a4).

  • dismissed + perPleaAgreement: true → 15A-146 treats dismissals pursuant to deferred prosecution or conditional discharge differently from plain ones.

  • "acquitted" → found not guilty or not responsible at trial. Routes to 15A-146(a2), and qualifies for automatic expunction under (a4).

  • "pjc" → neither conviction nor dismissal; no statute is suggested, by design.

  • "unknown" → the register text didn't map (e.g. "Superior Process/ Probation Other"). The full statute table comes back instead. Do NOT guess an outcome. EXCEPT where probationMatter is true — see below.

probationMatter: true per charge: the row is a G.S. 15A-1344/1345 PROBATION PROCEEDING, not a charge. A violation hearing on a judgment entered elsewhere, often in another county.

  • It returns NO statutes, and that empty list is an ANSWER, not a gap. This is the one place the "unknown → here is the whole statute table" rule above does not apply: the outcome text ("Violated probation by admission") maps to no family, but nothing is unclear — there is simply no charge here to route.

  • Do NOT read "Admits Violation" or "Probation Revoked" as a conviction. A probation violation is not a conviction of a crime and has no 145.x petition of its own.

  • It is NOT a bar. It does not stop the underlying conviction being expunged later, and if that case is expunged these entries go with it under G.S. 15A-150(b). Any petition belongs on the conviction file, in the county where the conviction was entered.

  • It makes automaticExpunction.applies false and determinable TRUE. (a4) requires every CHARGE to be dismissed/not-guilty/not-responsible, and a probation matter is none of those. Say the case does not expunge automatically — do not say the tool cannot tell.

  • "OUT OF COUNTY" in the offense text is the venue of the probation hearing only. It does not move where an expunction of the underlying case is filed.

An impaired-driving charge returns no statutes: G.S. 15A-145.5(a1) makes it ineligible.

G.S. 15A-146(a6): a court may grant a petition under that section WITHOUT a hearing, except where the section says otherwise. Do not tell someone to expect a hearing on a 15A-146 petition as though it were automatic.

Read-only. NC only. Informational, not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
felonyNo
caseNumberNo
convictionCountNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only cover readOnlyHint and openWorldHint, so the description carries the behavioral burden and does so in depth: it discloses that the (a4) determination is the tool's single decision, that everything else merely routes, that determinable:false is not a 'no', that eligibility is person-level and unverifiable here, and that an (a4) expunction is not destruction. This is far beyond what the annotations convey.

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?

The first sentence front-loads purpose and the regime/family sections are clearly delimited, so structure is deliberate rather than rambling. But the description runs to roughly a thousand words of all-caps imperatives with repeated ALWAYS/NEVER/DO NOT directives, which is well past the size an agent needs and dilutes the highest-priority instruction.

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, yet the description still supplies the interpretive meaning of the fields (regime, windowDeterminable, waiting dates, family, probationMatter, automaticExpunction) that the schema alone cannot convey. Given the legal nuance and the tool's narrow decision surface, nothing essential for correct invocation or correct phrasing of the answer is missing.

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

Parameters2/5

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

Schema description coverage is 0% across three parameters, so the description must compensate — and it only partly does. `caseNumber` is explained (omit it to get the whole statute table), but `felony` and `convictionCount` are never addressed: nothing tells the agent when to set felony or whether convictionCount feeds the 145.5(c) waiting-period arithmetic shown in the output. An agent must guess how two of the three inputs affect behaviour.

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?

The opening line states a precise verb+resource: routing each charge's disposition to the NC expunction statute and AOC petition form, with links, venue and fee. It is immediately distinguishable from siblings like lookup_court_case or search_judgments, which retrieve records rather than map dispositions to statute/form. The 'call with no caseNumber to get the whole statute table' sentence further pins down what the tool returns.

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?

Usage is exhaustively specified: check automaticExpunction first, do not lead with petition forms when it applies, treat probationMatter as an answer rather than a gap, abstain on unroutable reduces, and never present the tool as deciding eligibility. It also states the safe/unsafe answer boundary ('not yet eligible' is safe; 'eligible' never is), which is exactly the when-to-say-what guidance an agent needs.

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

check_traffic_chargeCheck whether a North Carolina (NC) traffic charge requires a court appearanceA
Read-only
Inspect

"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.

ParametersJSON Schema
NameRequiredDescriptionDefault
countyNo
chargesYes
court_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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.

court_delta_helpWhat Court Delta can do (capabilities + example questions)A
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations declare readOnlyHint=true and openWorldHint=false, and the description adds context beyond those: 'Returns static text; makes no court-portal request' discloses that no network/portal interaction occurs, and 'Calling this first just delays their answer' reveals the latency tradeoff of misusing the tool. No contradiction with the annotations.

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

Conciseness5/5

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

The description is front-loaded with the capability statement, then gives the call condition, then the exclusion with alternatives, then the behavioral note. Every one of the four sentences earns its place; the length is justified by the routing nuance needed across 15 sibling tools.

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 0 parameters, a readOnlyHint annotation, and an output schema already present, the description covers everything an agent needs: what it returns, when to call it, when to avoid it, what it does not do, and that no arguments are required. Nothing necessary is missing.

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

Parameters4/5

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

The tool has 0 parameters, which warrants a baseline of 4. The description explicitly states 'Takes no arguments,' confirming to the agent that invocation requires no input and that the schema's empty object is intentional, not a schema omission.

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?

The description states the purpose with specific verbs and resource: 'what this Court Delta server covers, with example questions.' It clearly distinguishes the tool from its siblings by positioning it as the capabilities/help endpoint, explicitly naming lookup_court_case and search_cases_by_party as the tools to use instead for actual court queries. An agent can tell this apart from every sibling without opening their schemas.

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?

The description provides explicit when-to-use ('ONLY when the user asks what this server / connector can do, what data it has, or how to use it'), explicit when-not-to-use ('It is NOT a step toward answering a court question'), and names the alternatives with routing conditions ('skip this and call lookup_court_case / search_cases_by_party directly'). This is the model of usage guidance.

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

court_visit_infoCourthouse location, phone and nearby parking for a North Carolina (NC) countyA
Read-only
Inspect

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 on the others is not a statement about them.

accessibility is published PER BUILDING — "wheelchairEntrance", "wheelchairParking", "wheelchairRestroom", "wheelchairSeating", "restroom". Report what a venue claims. An ABSENT flag is NOT a claim that the feature is missing: every venue claims wheelchair entrance, parking and restroom, but only 15 of 121 claim accessible SEATING, and no venue publishes assisted-listening data at all. For anyone who depends on a specific accommodation, give what's listed and say to call the courthouse to confirm the rest — do not report "not accessible" from a missing flag.

source:"nccourts-scrape" means the directory had no entry and this fell back to the live site, so hours will be empty — tell the user to call rather than inventing them. All 100 counties are currently in the directory, so this should be rare.

THIS IS LOCATION INFO, NOT CASE INFO — nothing about hearings, charges or status; use lookup_court_case for those. Cite the disclaimer: verify with the clerk before travelling. Read-only. NC only.

ParametersJSON Schema
NameRequiredDescriptionDefault
countyNo
caseNumberNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

The description is exceptionally transparent about behavioral quirks beyond the annotations: it warns that multiple locations may be returned, hours include lunch closures, absent parkingAttributes do not mean 'no parking', and source fallback leaves hours empty. It also confirms the readOnlyHint ('Read-only') and openWorldHint ('ABSENT MEANS NOT CLAIMED'). No contradiction with annotations is present.

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?

The description is long but deliberately structured with clear sections: purpose, disambiguation, hours, parking, accessibility, source fallback, and disclaimer. It is front-loaded with the core question it answers. Minor redundancy in the repeated warnings about not guessing between courthouses makes it slightly less concise than ideal.

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?

For a tool with subtle real-world pitfalls, the description covers nearly everything an agent needs: return shape, multi-location handling, matching against hearing locations, lunch closures, parking semantics, accessibility semantics, source fallback behavior, and when to route to another tool. The output schema exists, so the description doesn't need to enumerate return fields; the behavioral caveats are what matter and they are thoroughly addressed.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must carry parameter meaning. It does: it explains that `county` expects a value like 'Wake' and that `caseNumber` can be used to derive the county. The sole gap is that it doesn't discuss precedence or behavior when both parameters are supplied, and it doesn't give a caseNumber format example. Still, it compensates well for the schema's silence.

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?

The description opens with a specific statement of what the tool provides: 'Which courthouse, where it is, when it's open, and where to park.' It also explicitly distinguishes itself from case-related tools: 'THIS IS LOCATION INFO, NOT CASE INFO.' This clearly separates it from siblings like lookup_court_case.

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?

The description gives explicit when-to-use context: 'For "I have court on Tuesday — where do I go?"'. It names the alternative tool, lookup_court_case, for case info, and provides detailed disambiguation guidance involving upcomingHearings[].location. It even tells the agent when NOT to force a match and to show options instead.

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

cross_referencesWhat a North Carolina (NC) statute cites, and what cites itA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
citationYes
directionNoboth

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, and the description adds meaningful context beyond that: it explains the OUTBOUND vs INBOUND distinction, the section-level granularity rule (20-141(j1) → edge to 20-141), and that chapter-wide references are excluded. This helps the agent understand what results to expect and what to avoid.

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

Conciseness5/5

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

The description is tightly written, front-loads the core purpose, and uses clear examples. Each sentence adds value: purpose, usage, direction semantics, granularity rule, and pointer to the sibling tool. No wasted words.

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

Completeness4/5

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

Given the tool's complexity and the presence of an output schema, the description covers the essential semantics well. It explains the direction model, the granularity rule, and when to use the sibling get_statute. However, it omits documentation for the 'limit' parameter and does not spell out direction value options, which are minor gaps given the clarity of the core function.

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 0%, so the description carries the burden of documenting parameters. It conceptually explains direction (INBOUND/OUTBOUND) but does not enumerate the possible values for the 'direction' parameter or explain the 'limit' parameter. It also doesn't specify the citation format. Partial compensation, but gaps remain.

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?

The description states exactly what the tool does: lists statutes that a given NC statute cites (OUTBOUND) and those that cite it (INBOUND). It distinguishes itself from get_statute by explicitly directing text retrieval there, and the sibling list confirms this differentiation.

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?

Provides concrete example queries ('what does G.S. 14-72.1 depend on' or 'what else references it') and clarifies the two direction semantics. It also explicitly says 'For the text itself use get_statute', naming the alternative and the condition for choosing it.

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

diff_statuteDiff two versions of a North Carolina (NC) statuteA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoobserved
formatNounified
to_dateNo
citationYes
from_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=true and openWorldHint=false, but the description adds critical behavioral context: observed history begins at first ingest, most sections have only one version, and diff can be null. It also explains what mode='pending' actually compares. This goes well beyond the annotations.

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

Conciseness5/5

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

The description is information-dense but well-organized: main purpose, mode explanations, then a clear limitation and alternatives. Every sentence adds distinct value, and the most important discriminator (mode behavior) is front-loaded.

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

Completeness4/5

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

The description covers the key behavioral modes, limitations, and sibling routing, and an output schema exists for return values. However, it omits practical invocation details such as how to write the citation and date parameters, which are not covered by the schema descriptions. Minor but real gap.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It explains mode semantics well and implies from_date/to_date with 'optionally between two dates', but it does not describe citation format, date format, or the format parameter. With five parameters and no schema descriptions, this is a meaningful gap.

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 ('diff') and resource ('North Carolina statute section between two versions'), and immediately distinguishes the two modes. It also names sibling tools at the end, making the tool's role clear relative to amendment_history and pending_changes.

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 explicit when-to-use guidance for each mode: mode='pending' for enacted-but-not-yet-effective changes, mode='observed' for recorded versions. It also explicitly routes users to amendment_history for earlier dates and pending_changes for pending text, leaving no ambiguity about alternatives.

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

estimate_license_pointsEstimate North Carolina (NC) driver's-licence points for traffic chargesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chargesYes
priorPointsNo
commercialLicenseNo
outOfStateLicenseNo
recentlyReinstatedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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.

get_attorney_hearing_calendarAn attorney's court calendar (hearings) by North Carolina (NC) State Bar numberA
Read-only
Inspect

"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 lawyer's day.

  • none -> no cases exist under that name, so an empty calendar may mean the name is wrong rather than the day being clear.

The cross-check is evidence, not proof — a single match still warrants preferring the bar number when the answer decides whether someone travels to a courthouse.

SLOW ON A CACHE MISS — 30-120 seconds, because it drives a real browser through two CAPTCHAs. Tell the user you're pulling their calendar and let it run. This is the opposite of search_cases_by_attorney, which is fast and needs no warning. Repeat calls for the same search and range are served from a 6-hour cache and return instantly; cached: true with fetched_at tells you which you got. If the answer is being used to decide whether to appear somewhere, quote fetched_at.

AN EMPTY CALENDAR IS A REAL ANSWER, BUT ONLY WHEN THE LOOKUP SUCCEEDED. If the call returns an error, the calendar could NOT be checked — say that, and never turn it into "you have nothing scheduled". Those differ by someone missing court.

Covers all 100 counties at once; there is no county filter on this search. Public record. Read-only. NC only. Informational, not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
barNo
endNo
lastNo
firstNo
startNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses critical runtime behavior: slow cache-miss latency of 30–120 seconds due to CAPTCHAs, a 6-hour cache with `cached` and `fetched_at`, merged results on ambiguous name searches, and the difference between a successful empty result and an error. The annotations are not contradicted; they are substantially enriched.

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

Conciseness5/5

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

The description is long, but every section earns its place: required argument combos, sibling differentiation, attribution caveats, latency warnings, cache semantics, and error handling are all high-stakes for correct invocation. The core question and most critical constraint are front-loaded, and the formatting makes the guidance scannable.

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 tool's complexity, the description is essentially complete: it covers argument requirements, defaults, output contents, attribution risks, performance expectations, caching, error handling, geographic scope, and public-record status. The output schema exists for return structure, so the description need not repeat it; nothing an agent needs to call this tool correctly is missing.

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

Parameters4/5

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

With 0% schema description coverage, the description carries the full parameter burden and does most of it well: `bar` OR both `first` and `last` is required, lone names and no-argument calls are rejected, and absent dates default to today. The main remaining gap is that the date format for `start`/`end` is never specified, which an agent would need to construct valid date strings.

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?

The description opens with the exact question the tool answers — an attorney's hearing calendar — and states the resource and accepted identifiers clearly. It also explicitly names its sibling `search_cases_by_attorney` and distinguishes the two, so an agent can tell them apart without inspecting their schemas.

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 provides explicit routing: "THIS IS THE TOOL FOR 'TODAY', 'TOMORROW', 'THIS WEEK' AND 'MY CALENDAR'" and warns against substituting `search_cases_by_attorney`, explaining why that tool's file-date filters answer a different question. It also gives concrete decision guidance — prefer the bar number, read `attributable`, and never present an `error` result as an empty calendar.

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

get_statuteRead a North Carolina (NC) General Statutes sectionA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
as_ofNo
pendingNo
citationYes
max_charsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses what the tool returns: catchline, body, history note, and first-enacted/last-amended dates. It also explains the non-obvious behavior of `as_of` (past text) and `pending` (variants enacted but not yet effective), which is exactly the kind of context that helps an agent use the tool correctly.

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

Conciseness5/5

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

The description is dense but every sentence earns its place: definition, usage pattern, accepted inputs, return contents, temporal options, section-level constraint, and sibling routing. It is front-loaded and well organized, with no filler or repetition of schema defaults.

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?

For a read-only statute lookup tool with an output schema, this description is complete: it covers the exact use case, citation formats, temporal modes, return components, and when to choose sibling tools. The only minor gap, `max_chars` semantics, is mitigated by the schema's default value and does not prevent an agent from calling the tool correctly.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It does explain `citation` with accepted spelling examples, `as_of` as past-date text, and `pending` as not-yet-effective variants. However, `max_chars` is not explained at all, even though its default of 12000 could affect the returned text and its interaction with the promised 'full text' is unclear.

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?

The first sentence states a specific verb and resource: 'Full text of one North Carolina (NC) General Statutes section, by citation.' It also differentiates itself from siblings such as amendment_history and diff_statute by explicitly saying when to use those instead, so an agent can distinguish the tool without opening schemas.

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?

The description gives an explicit query pattern ('what does G.S. 14-72.1 say'), states the section-level limitation ('ask for "20-141", not "20-141(j1)"'), and names precise alternatives for related needs: amendment_history for WHEN it changed and diff_statute for WHAT changed.

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

list_cases_filedList North Carolina (NC) court cases filed by case type, county and dateA
Read-only
Inspect

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 date and case-number prefix to get past that. If truncated is true the count is a LOWER BOUND, and incomplete_prefixes names the exact buckets that were not read — say what is missing rather than reporting the number as a total. The remedy is a shorter date range or a county.

An empty result is a real answer, but only when the lookup succeeded. On an upstream failure this returns an error; never report that as "nothing was filed".

county_filter: "server" means the county was applied by the portal itself before its cap, and every row is additionally checked against the county code embedded in its case number — so a county-filtered result here is exact, unlike the location-substring filter the name searches use.

A date range is required (max 31 days) — an unbounded search cannot be completed. Read-only public record, North Carolina only. Informational, not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
countyNo
offsetNo
date_endNo
case_typeYes
date_startNo
case_statusNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations only mark readOnly and openWorld hints; the description goes far beyond by revealing defaults (yesterday, not today), partial-data risks for today's filings, the 200-case portal cap with truncation semantics, the 'server' county filter guarantee, and the finer-grained case_status values. This is substantial behavioral context that annotations alone could not convey.

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

Conciseness5/5

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

The description is long but every section earns its place by preventing real misuses: defaults, prefix semantics, truncation handling, and empty-result interpretation. It is front-loaded with the core purpose and sibling differentiation, then organized with clear bold labels, making the length navigable rather than bloated.

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 tool's complexity, output schema availability, and the many edge-case traps, the description is remarkably complete. It addresses required date-range limits, truncation, incompleteness prefixes, error handling, county exactness, and status reporting rules, leaving no critical operational gap for an agent selecting or invoking the tool.

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%, so the description carries full weight for parameter meaning. It thoroughly explains date_start/date_end formats and semantics, case_type as a prefix rather than exact code, case_status granularity and prefix-matching requirement, and county_filter's 'server' special value. Only limit/offset lack explicit exposition, but their defaults and the portal-cap context make their role inferable.

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?

The description leads with a specific verb and resource: 'What was FILED — every case of a given type in a county over a date range.' It immediately distinguishes itself from the sibling name-axis searches and provides concrete example questions, making it unmistakable which tool to invoke for docket-oriented lookups.

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?

The description explicitly names alternatives: use search_cases_by_party/_business/_attorney when you know WHO, use get_attorney_hearing_calendar for today's hearings, and avoid lookup_court_case just for case status. It also clarifies when an empty result is a real answer versus an upstream failure, leaving no ambiguity about when to use this tool.

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

lookup_court_caseLook up a North Carolina (NC) court case (by number, citation, or hash)A
Read-only
Inspect

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 have attended that morning). Relay howToRequest verbatim and it will be right for every state.

Read-only: no email is sent and nothing is saved. North Carolina only. Informational, not legal advice.

EVERY LOOKUP ENDS WITH TWO THINGS, PER CASE. Both are spelled out in present_to_user, the FIRST key of this result, already filled in for this particular case — read it and do what it says. (1) caseSummaryUrl — hand it to the user and call it the durable, shareable link to the full case record. It does not expire, it is publicly viewable, and the same case returns the same link every time, so it is the canonical way to cite or share the case. THE KEY IS ALWAYS PRESENT, so "when it appears" is not the test — the VALUE is: non-null means give it; null means minting failed on this lookup, so say nothing about a link rather than substituting trackThisCase.url, a portal URL, or a guess. (2) alerts — when alerts.available is true, ask whether they'd like email alerts when the case changes: a new court date, case information, case events, service events, or financial updates. ASK and wait for a yes. Never call subscribe_to_case_updates on your own initiative and never invent an email address. When available is false the case is closed, disposed, or not found — nothing would ever be sent — and you must not raise it. IN A MULTI-CASE TURN DO BOTH FOR EACH CASE, beside that case's own details. Two cases means two links and two offers; one combined link, or a single offer at the end of the answer, is wrong. (A search row's portal_url is ephemeral by contrast — don't present that as durable or persist it.) upcomingHearings lists only FUTURE hearings; pastHearings lists recently- elapsed ones (most recent first). The top-level status of "no_upcoming_hearings" means exactly that — NOT that the case has no hearing history. Before telling the user they have no court date, check pastHearings: an empty upcomingHearings with a non-empty pastHearings means a hearing has ALREADY occurred (they may have missed it) — a different answer than "nothing scheduled." Never infer "you didn't miss court" from an empty upcomingHearings/status alone. service answers "was the defendant actually reached?" on civil / SP / estate cases — the civil-side counterpart to bailRisk, and null on criminal/traffic, where service of process does not apply (null there = NOT APPLICABLE, not "not served"). Read status FIRST; three of its values mean the absence of a return is EXPECTED and must never be reported as "not served":

  • served / unserved / mixed — a return of service is docketed. mixed means both outcomes appear (several defendants, or the alias-and-pluries retry cycle).

  • proven_other — a certificate / affidavit / acceptance of service instead of a formal return. Still proof.

  • appeared_service_moot — the defendant answered or appeared, which waives a service defect. Service became unnecessary.

  • not_required — an appeal or petition; no summons is issued at all.

  • pending — a summons went out recently and nothing is back YET. Say "service is still outstanding", NOT "they weren't served".

  • unknown — a summons issued, nothing returned, and the case isn't new. returns[] is the full history (the retry cycle is often the story) and latestReturn the most recent attempt. returns[].party is NULL about a third of the time — the docket records the outcome without naming who it applied to — so never read a null party as "nobody". For the same reason there is deliberately NO per-defendant served flag: one case in the sample had a single docketed return against 41 defendants, and a per-party boolean would be confidently wrong. legacyScan:true means the paper file was scanned as ONE bundle rather than itemised, so proof of service may sit inside that PDF where no docket-text rule can see it — a missing return is weak evidence on those cases. causesOfAction is the civil counterpart to charges — the claims pleaded (cause, filedOn, remedy), e.g. "CV - Unfair Trade Practice". On a civil / SP / estate case this is usually the ONLY statement of what the matter is about, so lead with it there. An empty list means the docket does not ITEMISE causes, NOT that no claims exist — say the docket doesn't break them out rather than implying the case is about nothing. Repeated boilerplate entries are collapsed; distinct dates are kept, since a cause added later is an amendment. Each charge also carries offenseDate (when the offense occurred — different from the case's filedOn, and usually what someone means by "when was this?") and agency (the citing law-enforcement agency). If a tool returns an error with retryable / upstream_status, that is a transport or portal failure — NOT a statement about the case. Never turn it into "no results" or "case not found"; say the lookup itself failed, and retry only when retryable is true. caseCategory normalizes the case class (criminal | civil | infraction | special_proceeding | estate | juvenile | other). Use it to read null fields correctly: on a NON-criminal category, bailRisk/citationOptions = null means NOT APPLICABLE, not "none found." parties is the register-of-actions roster (name + roles[] + attorneys[]{name, appointment} + selfRepresented + counselWaived) — appointment is how counsel came to the case ("Retained" = the party hired them, vs "Court Appointed" / "Public Defender"; null when unstated, and the list is learned from the register rather than a closed set). It is what makes a counselWaived:true party who nonetheless HAS counsel intelligible — appointed, then a waiver, then retained. The authoritative source for identifying who is on a case and their role, especially on civil/SP cases where the caption/DOB are absent; prefer it over a party-search row's caption for entity resolution. selfRepresented:true = no counsel of record (self-listed as own attorney OR a filtered counsel-absence sentinel, with no other attorney); it does NOT distinguish an active pro-se appearance from a defaulted / served-by-publication defendant. counselWaived is a SEPARATE, independent flag — NOT a narrowing of selfRepresented — and it is NOT a claim the party is unrepresented: it can be true while attorneys[] is non-empty (seen on 22CR702455-520, counselWaived:true with a Court Appointed AND a Retained attorney, the docket running appointed counsel -> Waiver of Counsel -> retained counsel). Always read it WITH attorneys[], never instead of it. counselWaived is set by either Odyssey placeholder "attorney" name, filtered out of attorneys[] rather than shown as a lawyer: "WAIVED, WAIVED" (counsel affirmatively waived on the record — the docket does not say whether the waiver covered all assistance of counsel or only court-appointed counsel) or "PRO SE" (the party asserted as their own representation). Either means the party declined counsel rather than merely lacking it, but the flag does NOT say which placeholder produced it, so it is not proof the party is litigating pro se. counselWaived:false means NOT OBSERVED, not "did not waive". A true value is predominantly a criminal-side artifact and is rare on civil rosters — treat it as unexpected but NOT impossible on a non-criminal caseCategory; don't read one there as an error. A false unrepresented party is still any of defaulted / never-served / unappeared-entity / pro-se-without-a-docketed-marker — or simply TOO EARLY: on a recently-filed case that has not had a hearing yet, counsel is frequently not entered on the roster. parties reflects what is DOCKETED, not who is retained; check filedOn and an empty pastHearings before reading an empty attorneys[] as unrepresented — on a pending case that has not been to court, "not shown yet" is usually the better answer than "no lawyer." attorneys[] non-empty ⇒ represented ⇒ selfRepresented false. documents lists scanned filings, newest first — {date, name, url}, where name is the register entry that produced it ("Bond Forfeiture Notice", "Release Order Issued", "Waiver of Counsel"). Most criminal cases have at least one; an empty list means nothing is scanned in, not that nothing was filed. Offer the links when they're relevant to what was asked. Retrieval is UNRELIABLE — the portal intermittently returns errors or an empty body while it prepares a document — so present a link as something that may need a retry, never as "here is the document", and never state or guess at its contents: this server does not read them. dispositions gives the per-charge OUTCOME behind a "Disposed" status — one row per charge with plea, disposition, sentence, dispositionDate, judge, and any judgment documentUrls. This is how you answer "what happened to the case / to a charge": a "Disposed" caseStatus alone does not say whether a charge was dismissed, pled down, or convicted — read dispositions for that (e.g. a speeding charge reduced to improper equipment shows plea "Responsible to Lesser"; a "VD-District Dismissals ... Per Plea Agreement" is a dismissal). Empty on pending/undisposed cases. trackThisCase is an upstream ELIGIBILITY FLAG (non-null only on an open case), not something to act on: this server already consumes it — it is what gates alerts.available — so don't reason from it, and never show trackThisCase.url to the user. That is a generic signup page with no case identity. The case-specific paths are caseSummaryUrl and, once the user has said yes, subscribe_to_case_updates. For criminal cases with a bond or bail activity, bailRisk is non-null: failure-to-appear history (ftaCount, date-deduped; ftaEvents[] gives the raw counted entries {date, description} for auditing — voided "in Error/Stricken" FTAs are already excluded), FTA-triggered ordersForArrest, bond amount/type, and the NCGS §15A-544.5(f) prior-FTA bar. That bar turns on FTAs that preceded the bond's EXECUTION, not the case total: bondExecutedOn is the "Bond Posted" date for the operative bond and priorFtasAtExecution counts FTAs strictly before it (null when no posting is docketed).

  • setAsideBarInapplicable:true (0-1 prior FTAs) is RELIABLE — (f) cannot bar a set-aside. State it plainly; it's the answer that tells someone a motion is worth filing.

  • setAsideBarPossible:true (2+ prior) is NOT a finding that the bar applies. It means only that the TIMING fits. Under (f), actual notice exists ONLY where a judicial official noted the prior failures on the defendant's release order. Check releaseOrderFBox below before saying anything further, and never say "the forfeiture cannot be set aside" on the strength of this flag alone.

  • Both false = execution date unknown; neither ruled out nor suggested. releaseOrderUrl is the portal PDF of the release order governing that bond — the document the (f) question actually turns on, since the judicial official's "second or subsequent failure to appear" notation appears there (AOC-CR-200) and in NO structured field. ALWAYS present this link when setAsideBarPossible is true, even when the read below already answered the question: the order is the authority. releaseOrderFBox IS THAT READ, present only on barred cases where the order could be fetched and parsed. Report it, and report it precisely — this is the field that decides whether someone spends their one motion:

  • "unchecked" — on its face (f) does NOT bar a set-aside; the prior FTAs do not block relief and it is worth pursuing. Say so, and add that they should confirm it on the order before relying on it.

  • "checked" — (f) MAY bar it. Do NOT say "cannot be set aside". Tell them to confirm on the order BEFORE filing, because a motion that fails uses up the single opportunity for relief.

  • "ambiguous" — the order was opened and the box could NOT be read. Say exactly that, and hand over the link. The notation is a flattened checkbox with no glyph in the text layer, so the printed label appears whether or not it is marked. NEVER round this to "unchecked": a misread tells a bondsman to abandon a recoverable bond.

  • absent / null — no read was attempted (not a barred case, no order docketed, or the fetch failed). This is ALSO not "unchecked". Fall back to the link. For the forward-looking question ("could a bond I write NOW be barred?") use ftaCount: 2+ FTAs on the case means the next release order should carry the judicial notation — tell the user to read it before signing. Then forfeiture with its status (the latest DOCKETED forfeiture event — may lag the clock) and the 150-day set-aside clock (noticedOn, deadline, daysRemaining, windowOpen). noticeAnchor says where noticedOn came from: "notice_event" = an explicit forfeiture NOTICE line (the date the statute runs the 150 days from); "earliest_forfeiture_event" = no notice was docketed, so the earliest forfeiture entry stands in — the deadline is then a CONSERVATIVE proxy (earlier than the true notice), and daysFtaToNotice measures FTA-to-forfeiture rather than FTA-to-notice. Don't present a proxy-anchored deadline as the exact statutory date — treat windowOpen/daysRemaining as authoritative for whether the set-aside window is open; once windowOpen is false the window has closed even if status still reads in_effect. deadlineNextBusinessDay is the first day the clerk's office is open on or after deadline (equal to it when that is already a business day; later when it falls on a weekend or NC court holiday). ADVISORY ONLY — it never moves daysRemaining / windowOpen, which stay on the strict notice+150 date, because the safe error is telling someone they have LESS time, never more. null = UNDETERMINED (deadline year outside the published NC holiday calendar), NOT "no adjustment needed"; never present a null as though the deadline is a normal business day. triggeringFta (latest counted FTA on or before noticedOn) and daysFtaToNotice (the gap in days) report HOW LONG after the failure the forfeiture notice was docketed. Report the number; do NOT call a long gap a defect or a filing error — there is deliberately no threshold flag, and whether a gap affects the notice's validity is for the reader's attorney. Plus the bonding agent (Fiduciary) + surety (insurer). All from public NC eCourts records. (citationOptions is null on disposed/closed cases — the reduction path isn't live.) Informational underwriting signal, not legal advice; don't state legal conclusions.

ParametersJSON Schema
NameRequiredDescriptionDefault
caseHashNo
citationNo
caseNumberNo
portalSessionRefNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only say readOnlyHint/openWorldHint, but the description adds read-only semantics (no email sent, nothing saved, NC only, informational not legal advice), error-contract handling (`retryable`/`upstream_status` is a transport failure, not 'case not found'), liveness warnings (`portalSessionRef` lifetime unspecified and rotating; document retrieval unreliable), and null-reading rules across many fields. This is far beyond what the annotations carry.

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?

The core lookup and identifier guidance is correctly front-loaded, but the description then runs to roughly 1500 words with deep dives into dozens of output fields, repeating rules in multiple places. Most statements are individually useful, yet the sheer volume and the number of caveats make it hard to scan; it is over-specified relative to what an agent needs to select and invoke the tool.

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, yet the description still supplies the interpretive rules that the schema cannot (null = not applicable vs not found, deprecated alias handling, empty-list meanings). Nothing an agent needs to call this 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?

Schema coverage is 0%, so the description carries the full burden, and it does: it defines each of the four parameters, gives format examples for `caseNumber` and `citation`, explains that `portalSessionRef` is short-lived and must not be persisted, and marks `caseHash` as a deprecated alias. None of the parameters is left ambiguous.

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?

The opening sentence states a specific verb (look up) and resource (NC court case or traffic citation), and the next lines spell out the three accepted identifiers with examples. It also distinguishes itself from siblings by naming `search_cases_by_party` as the source of `portalSessionRef` and framing this tool as the follow-up to that search.

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 explicitly ranks the identifiers: `caseNumber` is the STABLE canonical choice, `portalSessionRef` is an immediate-follow-up fast path, and `caseHash` is a deprecated alias. It also gives when-to-use context for the returned alert flow (ask, wait for yes, never call `subscribe_to_case_updates` on your own initiative), which is unusual and genuinely directive.

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

pending_changesNorth Carolina (NC) statute changes enacted but not yet effectiveA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
chapterNo
citationNo
include_diffNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

With readOnlyHint=true, the annotation already covers safety. The description adds meaningful behavior: only future-dated variants are counted, a diff is returned by default, and AMENDMENT is distinguished from NEW SECTION with no diff. This goes beyond the annotations and reveals important non-obvious behavior.

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

Conciseness5/5

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

The description is compact, front-loaded with the core purpose, and every sentence adds distinct value: purpose, return contents, amendment vs new section behavior, and alternative tools. No redundant or filler language.

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

Completeness4/5

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

Given the output schema exists and readOnlyHint covers safety, the description is strong on scope, behavior, and alternatives. The only significant gap is the lack of explicit parameter descriptions, which is especially relevant because the input schema provides none.

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

Parameters2/5

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

Input schema has zero description coverage, so the description must compensate. However, it only tangentially mentions include_diff by saying 'by default a diff' and references Chapter 14, but it never explains limit, chapter, citation, or include_diff parameter intent. The 4 parameters are left essentially undocumented.

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?

Description clearly identifies the tool as handling NC statute text already enacted but not yet effective. It specifies the verb/resource relationship by explaining that it returns current and future variants with effective dates and diffs, and it differentiates the purpose from related tools like get_statute and amendment_history.

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?

Explicitly states when to use: 'Use for what changes to Chapter 14 are coming.' It also provides clear exclusions and alternatives: 'For text in force now use get_statute; for already-enacted history use amendment_history or recent_law_changes.' This gives an agent unambiguous routing guidance.

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

recent_law_changesRecently changed North Carolina (NC) statutesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
sinceYes
sourceNoboth
chapterNo
include_baselineNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

The description goes well beyond the readOnlyHint annotation by explaining the two data sources, their distinct meanings, and the fact that the initial corpus load is excluded unless include_baseline=true. This is valuable behavioral detail that an agent could not infer from the schema or annotations alone.

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

Conciseness5/5

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

The description is concise and well-structured: the core purpose is front-loaded, followed by essential source semantics, a baseline caveat, and a pointer to an alternative tool. Every sentence contributes useful information without unnecessary fluff.

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

Completeness4/5

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

For a tool with five parameters and multiple behavioral subtleties, the description covers the most important aspects: source kinds, baseline behavior, and sibling routing. However, it leaves the required 'since' format and 'chapter' semantics underspecified, which slightly reduces completeness for an agent preparing a valid call.

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?

With 0% schema description coverage, the description must compensate for parameter explanations. It explains include_baseline and partially explains source and since, but it does not clarify the expected format for the required 'since' parameter or the meaning of 'chapter' and 'limit'. This is a noticeable gap in parameter guidance.

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?

The description clearly states that this tool returns recently changed North Carolina statutes filtered by date or year. It also distinguishes itself from the sibling tool amendment_history by directing single-section queries there, leaving no ambiguity about its scope.

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?

The description gives explicit usage context: STATUTORY is for legislative history such as 'what passed in 2025', while OBSERVED covers database-detected changes. It also explicitly says to use amendment_history for a single section, providing a clear alternative and when-not-to-use guidance.

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

screen_names_by_partyScreen up to 5 people for North Carolina (NC) court cases (counts only)A
Read-only
Inspect

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 belonging to one person". There is no DOB or identity confirmation in this tool — do not treat a hit as identifying a specific individual.

Read-only. NC only. Public records. Informational, not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesYes
countyNo
case_statusNo
file_date_endNo
file_date_startNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description adds substantial behavioral context: live portal searches with a shared upstream token, slow responses (~60s for 3 names, ~2 min for 5), partial batch failures with per-name errors, portal_truncated as a lower bound, exact matching with no soundex, and no identity confirmation. No statement contradicts the annotations.

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

Conciseness5/5

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

The description is long but every section earns its place, covering limits, latency, partial results, truncation semantics, date formats, matching behavior, and disclaimers. The structure uses clear categorical labels and front-loads the primary purpose before caveats, making it scannable despite its length.

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 tool's complexity and the existence of an output schema, the description is remarkably complete: it covers rate-limit rationale, slow-response expectations, partial-failure behavior, truncation, date interpretation, exact-match semantics, identity limitations, and jurisdiction. Nothing an agent needs to call this tool correctly is missing.

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

Parameters4/5

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

With schema description coverage at 0%, the description carries the burden of explaining parameters. It explains that county, case_status, and file_date_* are narrowing filters, defines file_date_* as filing-date bounds, and specifies accepted date formats. It does not detail county value formatting or the effect of leaving filters null, but it compensates well for most of the schema's silence.

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?

The description opens with a specific verb and resource: 'Triage a SHORT list of people for North Carolina (NC) court cases.' It immediately identifies the exact use case ('which ones have cases?') and explicitly distinguishes itself from siblings like search_cases_by_party and lookup_court_case by stating it returns counts and facets, not case detail.

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?

The description states when to use this tool, what not to do ('This server cannot accept file uploads'), and names the alternatives: call search_cases_by_party for full rows or lookup_court_case for one case. It also gives concrete usage constraints: max 5 names per call, 3 at a time, split longer lists, and don't retry on slow responses.

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

search_cases_by_attorneyFind an attorney's cases by North Carolina (NC) State Bar numberA
Read-only
Inspect

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 200-CASE CAP IS REAL AND IT BITES HERE. truncated: true means matches are MISSING, not merely unshown — a busy defender or a large firm exceeds 200 routinely. case_status and file_date_start/file_date_end narrow SERVER-SIDE and genuinely recover cases; county does NOT — it filters after the cap, so a truncated county-filtered count is a lower bound, not a county total. Say the list is incomplete rather than presenting it as the attorney's full caseload.

A DATE RANGE MAY NOT BE ENOUGH ON ITS OWN. Measured: bar 21262 restricted to cases filed in 2024 still returned 200 truncated: true, spanning only 20 Nov to 31 Dec. Narrow to a few months and check truncated again rather than assuming one year fixed it.

Dates: ISO YYYY-MM-DD or MM/DD/YYYY — both accepted. file_date_* is WHEN THE CASE WAS FILED, not when a hearing is. For "what's on my calendar today", use get_attorney_hearing_calendar — filtering by file date answers a different question and will usually return nothing.

"OF RECORD" IS NOT "CURRENTLY REPRESENTING". This is what the register records, so withdrawn, substituted and long-closed representations still appear. Do not describe the result as someone's active caseload.

Public record — the portal offers this same search to anyone, so this is not a private view of a firm's book of business.

Read-only. North Carolina (NC) only. Informational, not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
barNo
lastNo
firstNo
limitNo
countyNo
case_statusNo
file_date_endNo
file_date_startNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

Annotations only supply readOnlyHint and openWorldHint; the description adds extensive behavioral detail: server-side versus post-cap filtering, truncated:true meaning matches are missing, finer-grained case_status values, NULL attorney_name for merged matches, 'OF RECORD' not equaling current representation, and public-record status. This does not contradict the annotations.

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

Conciseness5/5

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

Long, but the length is earned: every paragraph addresses a failure mode or routing decision an agent would otherwise get wrong. The most critical facts are front-loaded — purpose, status field, speed, and truncation — before the deeper caveats.

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?

The description supplies return-field expectations (case_number, caption, filing date, case type, county, case_status, attorney_name, matched_attorneys, truncated), explains the 200-case cap and its consequences, and provides guidance on how to report results honestly. An agent can invoke and interpret this tool correctly without needing the output schema.

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 schema description coverage at 0%, the description compensates by explaining the bar/last/first combination rule, accepted date formats and what file_date means, the case_status filter values versus the finer-grained returned values, and county's post-cap filtering weakness. Only limit is not explicitly discussed, but the 200-case cap and truncated behavior cover its practical impact.

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 a specific verb and resource: 'Cases where an attorney is counsel of record — by bar number OR by name.' It also distinguishes itself from siblings by naming lookup_court_case and get_attorney_hearing_calendar, and clearly scopes itself to North Carolina (NC) only.

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?

Explicitly labels the intended use ('"What's on my docket?" for a lawyer or firm') and gives direct routing rules: use get_attorney_hearing_calendar for calendar questions, do not call lookup_court_case merely for status, prefer bar number over name, and do not present merged multi-attorney matches as one lawyer's caseload.

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

search_cases_by_businessFind a company's court cases by business nameA
Read-only
Inspect

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 means real matches are MISSING. Worse, county filters AFTER that cap, so a truncated county-filtered count is a LOWER BOUND, never a total — "11 cases in Wake" may be 11 of the 200 statewide the portal was willing to show. Only case_status and the file-date range narrow server-side. Say the list is incomplete instead of reporting a count as if it were complete.

matched_businesses lists the distinct entity names actually hit. More than one means legally separate entities are mixed together ("FOOD LION, LLC" alongside "DELHAIZE AMERICA, LLC") — surface that rather than treating them as one company.

Dates: ISO YYYY-MM-DD or MM/DD/YYYY — both accepted. These bound WHEN THE CASE WAS FILED, not when anything is scheduled. A year at a time is the most effective way to get a chain's cases under the 200-cap: 'FOOD LION' unfiltered caps out, but restricted to 2023 it returns 42 complete rows.

Public record. Read-only. North Carolina (NC) only. Informational, not legal advice.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
limitNo
countyNo
case_statusNo
file_date_endNo
file_date_startNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description discloses extensive behavioral traits beyond the annotations. It reveals that the tool is fast (5-45 seconds), has no CAPTCHA, that case_status rows are finer-grained than filter values (so equality checks fail), that there is no party role (every row labeled 'Defendant' incorrectly), that the 200-case cap affects results and county filters happen after truncation, and that matched_businesses lists distinct entities. It also explicitly states 'Public record. Read-only.' which aligns with the readOnlyHint annotation. No contradictions.

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

Conciseness5/5

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

The description is long but every sentence carries essential information. It is structured with clear sections and emphasis (bold, caps) to highlight pitfalls and constraints. The primary purpose and alternative are front-loaded, followed by critical usage rules and edge cases. There is no filler; each clause adds value.

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 tool's complexity (6 parameters, output schema, many potential pitfalls), the description is remarkably complete. It covers usage guidelines, behavioral expectations, parameter nuances, and result semantics (e.g., case_status granularity, matched_businesses meaning). It also warns against common mistakes (e.g., not testing equality with filter vocabulary, not claiming the business is the defendant). With an output schema present, the description needn't explain return structure, but it still clarifies result semantics. Nothing an agent needs to call this tool 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?

Although schema description coverage is 0%, the description adds critical semantics for each parameter: name must be typed as it appears with the comma included; limit is not mentioned but default is in schema; county filter happens after the 200-case cap (so counts are lower bounds); case_status values are broad but actual results are more detailed; file_date_start/end bound filing dates and accept two formats. The description also explains wildcard behavior (at least 4 chars before *) and recommends yearly filtering to stay under the cap. This far exceeds what the schema provides.

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?

The description states a specific verb and resource: find court cases by business name. It explicitly differentiates from sibling search_cases_by_party by specifying that this tool is for organizations (LLC, corporation, insurer, etc.) and that party search requires first and last names. The purpose is unambiguous and well-scoped.

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?

The description provides explicit when-to-use and when-not-to-use guidance: 'Use this, not search_cases_by_party, whenever the subject is an organization.' It explains why the alternative fails for businesses. It also gives detailed usage tips: comma significance, wildcard rules, date formats, the 200-case cap, and how to handle truncation and county filters. These are actionable instructions that guide correct invocation.

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

search_cases_by_partySearch North Carolina (NC) court cases by party (person) nameA
Read-only
Inspect

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:

  • SERVER-SIDE narrowing (reduce the portal search — the ONLY way to clear the 200-case cap): case_status ("Pending"|"Disposed"|"Closed"|"Reopened"), the filed-date range file_date_start/file_date_end (ISO YYYY-MM-DD or MM/DD/YYYY — both accepted), and a more specific name.

  • soundex: true is also server-side but BROADENS (phonetic surname matching → MORE matches, more likely to truncate) — don't enable it to clear a cap.

  • CLIENT-SIDE (filter the rows already returned; do NOT recover cases missed by the cap): county ("Wake" or "Wake County") and case_type (pick a value from the narrowing.caseTypes facet).

Speed: a search runs a live portal query and takes ~15-50s, with real run-to-run variance — do NOT pick filters for speed. Narrow for COMPLETENESS: case_status and a file_date range are server-side and are the only filters that recover cases past the 200-cap; county/case_type only filter what was already returned.

Two different limits:

  • portal_truncated true = the portal hit its statewide 200-case cap, so the set is INCOMPLETE (real matches are missing). See portal_truncated_note; when true, narrowing gives counties only (counts are lower bounds). Clear it with case_status / date range / a more specific name.

  • results_truncated true = the (complete) set exceeded limit, so not all rows are shown. Pass a higher limit (up to 200) to show them all.

Breadth (read narrowing_hint): the tool never asks you to withhold results, and it distinguishes two cases with different remedies:

  • INCOMPLETE (portal_truncated true): the shown cases are valid but some are missing. Present them, and to recover the rest narrow with server-side filters (a filed-date range or case_status) — or, if autonomous with no user to ask, re-call confirm_broad=true to proceed as-is.

  • COMPLETE but long (a large set with portal_truncated false): nothing is missing. List or summarize the results; refining (county/case_type/date) is optional, not required. A moderate complete set is a fine answer on its own.

ParametersJSON Schema
NameRequiredDescriptionDefault
lastYes
firstYes
limitNo
countyNo
soundexNo
case_typeNo
case_statusNo
confirm_broadNo
file_date_endNo
file_date_startNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the readOnlyHint and openWorldHint annotations, the description discloses critical behaviors: the ephemeral lifetime of portal_session_ref, truncation flags (portal_truncated vs results_truncated), fine-grained case_status values that do not match the filter enum, party_role_source trust levels, and the 15-50s runtime variance. This goes far 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?

The description is long, but the tool is complex with 10 parameters, two truncation limits, server-side vs client-side filtering, and token-lifetime caveats. Nearly every sentence carries operational value; the main cost is that the length requires an agent to parse several dense paragraphs, so it is not maximally concise, but it is well-structured with clear topic breaks.

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?

The description covers the full calling context: required and optional inputs, result semantics, truncation handling, follow-up tool routing, data-quality caveats, read-only nature, jurisdiction, and legal disclaimer. With an output schema present, it does not need to document return types, and nothing essential for correct invocation 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?

Schema description coverage is 0%, but the description fully compensates by explaining every parameter: last/first required, limit up to 200, county values, soundex broadening behavior, case_type sourced from narrowing.caseTypes, case_status enum plus the caution about finer-grained return values, confirm_broad for autonomous recovery, and file_date_start/end accepted formats. This is exemplary parameter-level documentation.

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?

The description opens with a specific, unambiguous statement: 'Search North Carolina (NC) court cases by a person's name.' It clearly identifies the resource (NC eCourts party-name search), the action (search), and the scope (party/person), and the title and first sentence align exactly with the tool name and its distinguishing role among sibling 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?

The description gives explicit when-to-use and when-not-to-use guidance: it tells the agent to pass portalSessionRef to lookup_court_case for quick follow-up, to use case_number for persisted work, to NOT call lookup_court_case just to check open/closed status, and to call lookup_court_case for an authoritative role/roster. It also explains exactly which filters are server-side versus client-side and when to use them to recover truncated results.

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

search_judgmentsSearch North Carolina (NC) money judgments and criminal sentences (incl. aliases)A
Read-only
Inspect

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 debtor's real property in that county, whatever its cause of action says. So CV - Money Owed, CV - Collection on Account and CV - Transcript of Judgment rows are encumbrances too. Measured on one name: 4 rows whose cause contains "lien", and 35 further docketed money judgments the filter would silently drop — roughly a tenfold under-count. For a lien or title question, DO NOT filter; report the whole set and let the reader classify.

cause_of_action is for isolating a RECORD TYPE — "show me only the lis pendens", "only the summary ejectments" — not for deciding what counts as a lien.

ASK WHICH RECORD TYPES THEY WANT — do not guess. Run the search, read narrowing["Cause of Action"] (computed from the actual rows, BEFORE any filter, so it always shows the full menu), tell them what is there, and let them choose.

cause_of_action MATCHES ON SUBSTRING AND FILTERS CLIENT-SIDE. "lien" catches every lien variant above; "Claim of Lien" catches only G.S. 44A. Because the index offers no server-side filter for it, the match runs over the rows already fetched — so when results_total exceeds what was fetched, cause_of_action_note will say the count is NOT a total. Read that note before reporting a number.

NOT in this index, and not anywhere in this server: UCC financing statements (those are NC Secretary of State), Register of Deeds records, and lien-agent notices under G.S. 44A-11.1 (liensnc.com is not a court system). Say so plainly rather than implying a clean search covered them.

ARGUMENT FORMATS (the requirement itself is stated at the top). party is a name in "LAST, FIRST" form (business names work as-is). case_number accepts dashed or undashed. from_date/to_date bound the date the judgment was ORDERED (not the case filing date, and not a hearing date) — ISO YYYY-MM-DD or MM/DD/YYYY, both accepted.

A PARTY SEARCH DOES NOT COVER ALIASES, so this tool checks them for you. party and alias are separate indexes with no overlap — measured, a search for "WILLIAMS, PAMALA" as a party misses a judgment filed against "MCARDELL, PAMALA" that lists "WILLIAMS, PAMALA" as an alias. Whenever you pass a full party name, an alias sweep runs automatically alongside it and its hits come back in alias_matches, separate from results.

READ alias_sweep.status BEFORE CALLING ANYONE CLEAR: "ran" -> aliases were checked. Zero matches is a real negative. "failed" -> they were NOT checked. Say so; do not report the search as clear. "skipped" -> not applicable, EXCEPT when the reason says the name was a surname only. Ask for a full "LAST, FIRST" name and re-run.

AN ALIAS IS NOT NECESSARILY A FORMER NAME. It is any other name recorded for that party — a maiden or married name, a hyphenated or reordered variant ("LEWIS-WILLIAMS, FARRAH" vs "WILLIAMS, FARRAH LEWIS"), or a fuller spelling ("WILLIAMS, SHANE" vs "WILLIAMS, SHANE CHRISTOPHER"). Measured, 15% share the party's own surname. Do NOT describe an alias as a name that was "changed", and do not infer a marriage or divorce from one — the record does not say.

An alias_matches row is filed against a party recorded under a DIFFERENT NAME, so it may be the same person or an unrelated namesake. Report those rows as leads to confirm — never state them as this person's judgments, and never merge them into a total owed. They carry no amounts.

alias as an INPUT searches the alias index directly and takes the same "LAST, FIRST" form ("PAMALA WILLIAMS" returns nothing). Passing it explicitly turns the automatic sweep off, since it would repeat the same query.

Row-level debtor_aliases / creditor_aliases list other names recorded for that party. They are populated essentially only on alias searches — empty on a party search is normal and means nothing.

CIVIL vs CRIMINAL — read this before reporting a null. Each row has a case_category of CV, CR or FAM. judgment_type populates on civil rows; sentence_type populates on criminal rows. A null on either one means NOT APPLICABLE to that row's category — it is NOT an absence of fact, and must never be reported as "no sentence recorded" or "no judgment type".

DOLLAR AMOUNTS ARE FETCHED AUTOMATICALLY WHEN THE RESULT SET IS SMALL — do NOT ask the user whether to pull them. Leave detail unset and this tool decides: a case_number search, or any search returning 10 rows or fewer, comes back with amounts already included. Check detail_included to see what happened, and detail_skipped_reason when it didn't.

The reason it is not unconditional: detail fans out one upstream call PER ROW. A broad name search with detail forced on has been measured timing out at 60s — "ANDERSON, DAVID" returns 153 judgments, and asking for 153 amounts at once fails outright, whereas the same search without detail succeeds. So on a large result set the amounts are deliberately skipped and detail_skipped_reason tells you how to narrow (county, date range, judgment_type, or a specific case_number). Narrow and re-run rather than forcing it.

Override only if you must: detail=true still respects the row guard and will not fan out over a large set; detail=false suppresses amounts entirely.

With detail, each row gains total_judgment_amount, principal_amount, court_costs, attorney_fees, interest_rate, judgment_status and the for/against party roster. Amounts are strings; a null means the court recorded no value, which is different from "0.00". Where detail is null on a row, no dollar figure is available — never infer or state an amount from such a row.

Filters:

  • county — a plain county name ("Wake"). Filtered SERVER-SIDE and exactly, covering both that county's District and Superior court. Unlike search_cases_by_party, this filter does not eat into a result cap.

  • judgment_type — civil, comma-separated, e.g. "Recorded", "Granted in Whole or Part", "Default Civil".

  • sentence_type — criminal, comma-separated, e.g. "Active", "Community", "Intermediate", "Fine". Every valid value for all three is returned in facets with live counts, so read facets rather than guessing a filter value.

Speed: ~1-3 seconds. This tool is the FAST exception — it does NOT run the slow WAF-gated portal search that search_cases_by_party and lookup_court_case do, so do not warn the user about a long wait here.

Completeness: results_total is the TRUE statewide total. This index has no 200-case cap, so the truncation caveat that applies to search_cases_by_party does NOT apply here. results_truncated reflects only the display limit; page further with offset if needed.

Read-only. NC only. Informational, not legal advice. A name match is not an identity confirmation — same-name people are common.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNorelevance
aliasNo
limitNo
partyNo
countyNo
detailNo
to_dateNo
from_dateNo
case_numberNo
judgment_typeNo
sentence_typeNo
cause_of_actionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description adds extensive behavioral context beyond the readOnlyHint/openWorldHint annotations: the real-property-lien coverage, the absence of a 200-cap (contrasted with search_cases_by_party), the ~1-3s speed as 'the FAST exception', the alias-sweep status states (ran/failed/skipped), the detail fan-out timeout risk (60s on 'ANDERSON, DAVID'), and client-side substring filtering. Nothing contradicts the annotations — 'Read-only. NC only.' aligns with readOnlyHint=true.

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?

Well-structured with bold section headers, front-loaded purpose, and clear warnings — but the description runs roughly 1,800 words and repeats itself. The lien warning (DO NOT FILTER TO lien) is belabored across three paragraphs, and the alias concept is explained twice. For a genuinely complex tool most sentences earn their place, but the same points could be made in considerably less space.

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?

For a 12-parameter tool with deep behavioral quirks — alias sweeps, detail fan-out, lien classification, cause_of_action substring semantics, no-cap completeness — the description is remarkably complete. It even addresses return-value nuances (alias_matches as leads, detail_skipped_reason, detail_included) that an output schema would not fully cover, and it has a schema for structured output. Nothing an agent needs to call this correctly is missing.

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

Parameters4/5

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

With schema description coverage at 0%, the description carries the full burden and compensates heavily: party ('LAST, FIRST' form), case_number (dashed or undashed), from_date/to_date (binds the ORDERED date, ISO or MM/DD/YYYY), county (server-side exact), judgment_type/sentence_type (comma-separated civil/criminal), alias (direct index search that disables the sweep), cause_of_action (substring match), and detail (auto-fetch behavior). The only parameter left undocumented is 'sort', which is a minor gap given nine others are covered in depth.

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?

The title and opening line state a specific verb+resource: 'Search North Carolina (NC) money judgments and criminal sentences by party name.' It sharply distinguishes itself from siblings by declaring 'This is the JUDGMENT index, NOT the case index' and naming search_cases_by_party and lookup_court_case as the alternatives for case-level queries. An agent can unambiguously tell this tool apart from every sibling.

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 when-to-use ('does X have a judgment against them', 'how much do they owe', 'find liens/judgments before I lend or rent') and when-not-to-use ('For the case itself... use search_cases_by_party or lookup_court_case') are both given. It also states explicit exclusions (UCC filings, Register of Deeds, liensnc.com) and strong anti-pattern warnings like 'DO NOT FILTER TO lien' and 'DO NOT ask the user whether to pull [amounts]' — guidance an agent can act on without inference.

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

search_statutesSearch North Carolina (NC) statutes by topic or keywordA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
chapterNo
include_repealedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already mark it read-only; the description adds behavior: returns ranked snippets rather than full text, expands court abbreviations case-insensitively and reports it in expanded_query, searches current law at section level, and treats low top rank as evidence the subject may not be statutorily covered. No contradiction with readOnlyHint or openWorldHint.

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

Conciseness5/5

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

The description is longer than average but front-loads the core search-and-get_statute workflow first, then syntax, then interpretation. Every paragraph earns its place with examples and operational guidance; no filler.

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 output schema and annotations, the description gives an agent enough to select the tool, form a correct query, understand abbreviated input handling, and know what the result means. It lacks only a bit of detail on chapter/include_repealed filtering, which is unlikely to mislead.

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

Parameters4/5

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

Schema contains no property descriptions, so the description must carry the burden. It thoroughly explains query syntax (exact phrases, -excluded terms, or) and shorthand expansion, which is the highest-value parameter. It does not explicitly walk through limit, chapter, or include_repealed, though their names/defaults make them fairly discoverable; this is a small but real gap.

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?

The description names a specific verb, resource, and mode: search NC statutes by topic, keyword, or phrase. It gives concrete examples and immediately contrasts with get_statute, so an agent can distinguish search tools without opening schemas.

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?

Explicitly states when to use: when you know the subject but not the citation. It names the alternative (get_statute) for citation lookups and even tells the agent to follow up with get_statute after selecting a section. It also explains how to interpret low relevance rather than forcing a match.

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

subscribe_to_case_updatesSign up for email alerts when a North Carolina (NC) case changes (sends a confirmation email)A
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
emailYes
phoneNo
case_numberYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description thoroughly explains side effects: it creates a pending signup, sends a confirmation email, stores name/email/phone/case number, includes an unsubscribe link, and does not share with attorneys. It clarifies that monitoring only starts after the user clicks the link, that count-based detection means moved hearings don't trigger alerts, and that a third active case returns a plain message. This exceeds the annotations' basic readOnly/destructive hints and fully informs the agent of the tool's behavior.

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

Conciseness5/5

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

The description is long but every sentence delivers essential information. It is logically organized: purpose first, then safety constraints, then detailed behavior, storage, limits, and scope. Key warnings are emphasized with all caps, and the formatting makes it easy to scan. Nothing is redundant or tangential.

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 tool's complexity, the description covers all critical aspects: purpose, side effects, limitations (count-based alerts, free account cap), privacy (no sharing), required versus optional inputs, explicit instructions for interacting with the user, and regional scope. It also addresses edge cases (dormant signup, third active case) and provides a fallback to another tool (search_cases_by_party). This is a complete and self-contained description.

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?

Although the input schema has no parameter descriptions, the text explains every parameter: name and email are stored, phone is optional, and case_number is required ('A case number is required — subscribe to a case, not to a person's name'). It also clarifies that email is used for sending alerts and that the user must confirm the email address aloud. This fully compensates for the schema's lack of descriptions.

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?

The description clearly states the purpose: 'Sign the USER UP for email alerts when a North Carolina (NC) case changes.' It explicitly distinguishes itself from lookup tools ('It is not a lookup'), uses a specific verb ('sign up'/'subscribe'), and identifies the resource ('case updates'). The additional details about sending a confirmation email and storing information further clarify what the tool does.

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?

The description provides explicit usage guidance: it tells agents to only subscribe the person they are talking to, to confirm details before calling, to use search_cases_by_party if only a name is available, and to subscribe to a case number rather than a person's name. It also specifies the geographic scope ('NC only') and warns against promising alerts for moved hearings or disposition changes. This covers both when to use and when not to use the tool.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Addedsearch_statutes
  2. 7 tool updates
    • Addedamendment_history
    • Addedchapter_activity
    • Addedcross_references
    • Addeddiff_statute
    • Addedget_statute
    • Addedpending_changes
    • Addedrecent_law_changes
  3. 2 tool updates
    • Changedcheck_traffic_charge9 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"
    • Changedestimate_license_points9 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"
  4. 1 tool update
    • Changedcheck_traffic_charge1 field changed
      • addedInput schema / properties / court_date
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null
        +}
  5. 15 tool updates
    • First observedcheck_court_scam
    • First observedcheck_expunction_options
    • First observedcheck_traffic_charge
    • First observedcourt_delta_help
    • First observedcourt_visit_info
    • First observedestimate_license_points
    • First observedget_attorney_hearing_calendar
    • First observedlist_cases_filed
    • First observedlookup_court_case
    • First observedscreen_names_by_party
    • First observedsearch_cases_by_attorney
    • First observedsearch_cases_by_business
    • First observedsearch_cases_by_party
    • First observedsearch_judgments
    • First observedsubscribe_to_case_updates

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources