@cliwant/mcp-sam-gov 1.16.0 → 1.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"toolsets.d.ts","sourceRoot":"","sources":["../src/toolsets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,iHAWpB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAW/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAGlD,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAmMlE,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,uCAAuC;IACvC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,aAAa,CAkEf;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvD,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAC1B,CAAC,EAAE,CAEL;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B;IACD,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,CAAA;KAAE,CAAC;CACvE,CAyBA"}
1
+ {"version":3,"file":"toolsets.d.ts","sourceRoot":"","sources":["../src/toolsets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,gCAAgC;AAChC,eAAO,MAAM,iBAAiB,iHAWpB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAW/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAGlD,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAoMlE,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,uCAAuC;IACvC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6DAA6D;IAC7D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,aAAa,CAkEf;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvD,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,GAC1B,CAAC,EAAE,CAEL;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B;IACD,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE;QAAE,IAAI,EAAE,iBAAiB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,CAAA;KAAE,CAAC;CACvE,CAyBA"}
package/dist/toolsets.js CHANGED
@@ -187,6 +187,7 @@ export const TOOL_TOOLSET_MAP = {
187
187
  echo_facility_report: "vetting",
188
188
  epa_tri_facilities: "vetting",
189
189
  courtlistener_search_opinions: "vetting",
190
+ courtlistener_search_dockets: "vetting",
190
191
  nonprofit_search: "vetting",
191
192
  nonprofit_financials: "vetting",
192
193
  lda_search_filings: "vetting",
@@ -1 +1 @@
1
- {"version":3,"file":"toolsets.js","sourceRoot":"","sources":["../src/toolsets.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toolsets.js","sourceRoot":"","sources":["../src/toolsets.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cliwant/mcp-sam-gov",
3
- "version": "1.16.0",
3
+ "version": "1.17.0",
4
4
  "mcpName": "io.github.cliwant/mcp-sam-gov",
5
5
  "description": "Most comprehensive keyless-first MCP server for US federal + state/local (SLED) contracting + spending + regulation: SAM.gov, USAspending, Federal Register, eCFR, Grants.gov, plus SLED procurement bids (OpenGov, Bonfire, ArcGIS, Socrata 53 hosts). 152 tools (147 need no API key), plug into Claude Desktop / Claude Code / Codex CLI / Cursor / Continue / Gemini CLI.",
6
6
  "keywords": [
@@ -207,7 +207,8 @@ export function extractNextCursor(next: unknown, label: string): string | null {
207
207
 
208
208
  // ─── Tool: courtlistener_search_opinions ──────────────────────────
209
209
  export type CourtlistenerSearchOpinionsArgs = {
210
- query?: string; // → q
210
+ query?: string; // → q (full-text; bare company name → text mentions, NOT actual-party)
211
+ party?: string; // → caseName:"…" fielded query; finds actual-party cases (~327 for "Lockheed Martin" vs ~5,954 bare)
211
212
  court?: string; // a court id (e.g. uscfc|cafc|scotus); ^[a-z0-9]+$
212
213
  dateFiledAfter?: string; // → filed_after; ^\d{4}-\d{2}-\d{2}$
213
214
  dateFiledBefore?: string; // → filed_before; ^\d{4}-\d{2}-\d{2}$
@@ -280,7 +281,12 @@ export async function searchOpinions(
280
281
  const filtersApplied: string[] = [];
281
282
  // natureOfSuit has no verified dedicated filter on the v4 opinions search, so it
282
283
  // is folded into the `q` full-text query (disclosed via NATURE_OF_SUIT_QUERY_NOTE).
284
+ // `party` builds a caseName:"…" fielded query (actual-party match, not text mention).
283
285
  const qParts: string[] = [];
286
+ if (args.party !== undefined && args.party !== "") {
287
+ qParts.push(`caseName:"${args.party}"`);
288
+ filtersApplied.push("party");
289
+ }
284
290
  if (args.query !== undefined && args.query !== "") {
285
291
  qParts.push(args.query);
286
292
  filtersApplied.push("query");
@@ -463,3 +469,240 @@ function summarizeDrfError(body: unknown): string | null {
463
469
  }
464
470
  return parts.length > 0 ? parts.join(" | ") : null;
465
471
  }
472
+
473
+ // ─── Tool: courtlistener_search_dockets ───────────────────────────
474
+ // RECAP dockets (type=r) — the CASE-RECORD lane. FCA/qui tam matters are DOCKETS:
475
+ // they rarely produce a published opinion (settlements close out of court) so they
476
+ // are invisible to type=o. suitNature:"…" is a REAL fielded filter on dockets (not
477
+ // folded into q like the opinions natureOfSuit). Each docket row carries parties,
478
+ // filing date, status, assignee, and the docket page URL — the case record the judge
479
+ // wanted. `dateTerminated` is null when the case is still open (never "").
480
+ // Same SSRF / auth / cursor / provenance machinery as searchOpinions.
481
+
482
+ export type CourtlistenerDocket = {
483
+ caseName: string | null;
484
+ caseNameFull: string | null;
485
+ court: string | null; // court_citation_string / court
486
+ courtId: string | null; // court_id (e.g. "gand", "flmd")
487
+ dateFiled: string | null;
488
+ dateTerminated: string | null; // null when still open — NEVER ""
489
+ docketNumber: string | null;
490
+ natureOfSuit: string | null; // from suitNature — the FCA filter field
491
+ cause: string | null;
492
+ assignedTo: string | null;
493
+ jurisdictionType: string | null;
494
+ url: string | null; // full https://www.courtlistener.com/... docket URL
495
+ };
496
+
497
+ export type CourtlistenerSearchDocketsArgs = {
498
+ party?: string; // → caseName:"…" fielded query
499
+ query?: string; // additional free-text → folded into q alongside caseName
500
+ natureOfSuit?: string; // → suitNature:"…" REAL fielded filter on dockets
501
+ court?: string; // court id; ^[a-z0-9]+$
502
+ dateFiledAfter?: string; // → filed_after; ^\d{4}-\d{2}-\d{2}$
503
+ dateFiledBefore?: string; // → filed_before; ^\d{4}-\d{2}-\d{2}$
504
+ order?: string; // default "dateFiled desc"
505
+ cursor?: string; // opaque continuation
506
+ };
507
+
508
+ const DOCKET_PROVENANCE_NOTE =
509
+ "Data = US FEDERAL COURT PUBLIC RECORDS (dockets) served by CourtListener (Free Law Project, a non-profit) — NOT a .gov API. CourtListener republishes these records keyless; the .gov primary source (PACER) is PAYWALLED. Docket = case record (parties, filing, status); outcome/settlement is NOT in the docket record — read the docket page or DOJ press releases for that detail.";
510
+
511
+ const DOCKET_SUIT_NATURE_NOTE =
512
+ "natureOfSuit was applied as a fielded suitNature:\"…\" query — this IS a real filterable field on dockets (unlike opinions where it is folded into free-text q).";
513
+
514
+ /** Map ONE RECAP docket result row → curated CourtlistenerDocket shape. */
515
+ function mapDocket(raw: unknown): CourtlistenerDocket {
516
+ const o = (raw ?? {}) as Record<string, unknown>;
517
+ return {
518
+ caseName: str(o.caseName) ?? str(o.case_name),
519
+ caseNameFull: str(o.caseNameFull) ?? str(o.case_name_full),
520
+ court: str(o.court_citation_string) ?? str(o.court),
521
+ courtId: str(o.court_id),
522
+ dateFiled: str(o.dateFiled) ?? str(o.date_filed),
523
+ // null when open — NEVER coerce undefined/"" to ""
524
+ dateTerminated: (() => {
525
+ const raw2 = o.dateTerminated ?? o.date_terminated;
526
+ const s = str(raw2);
527
+ return s === "" ? null : s;
528
+ })(),
529
+ docketNumber: str(o.docketNumber) ?? str(o.docket_number),
530
+ natureOfSuit: str(o.suitNature) ?? str(o.suit_nature),
531
+ cause: str(o.cause),
532
+ assignedTo: str(o.assignedTo) ?? str(o.assigned_to_str),
533
+ jurisdictionType: str(o.jurisdictionType) ?? str(o.jurisdiction_type),
534
+ url: resolveAbsoluteUrl(o.docket_absolute_url ?? o.absolute_url),
535
+ };
536
+ }
537
+
538
+ /**
539
+ * Search RECAP dockets via CourtListener (`/api/rest/v4/search/`, type=r).
540
+ * FCA/qui tam matters are DOCKETS — they rarely produce published opinions and are
541
+ * invisible to courtlistener_search_opinions (type=o). suitNature:"…" is a REAL
542
+ * fielded filter on dockets. KEYLESS / CURSOR / provenance same as searchOpinions.
543
+ */
544
+ export async function searchDockets(
545
+ args: CourtlistenerSearchDocketsArgs,
546
+ ): Promise<MetaBundle> {
547
+ const label = COURTLISTENER_SEARCH_LABEL;
548
+
549
+ // ── Validate (SSRF + honesty). Same guards as searchOpinions. ──
550
+ if (args.court !== undefined && !COURT_RE.test(args.court)) {
551
+ throw new ToolErrorCarrier({
552
+ kind: "invalid_input",
553
+ retryable: false,
554
+ message: `Invalid court ${JSON.stringify(args.court)} — expected a CourtListener court id (lowercase alphanumerics, ^[a-z0-9]+$), e.g. "gand", "flmd", "cafc".`,
555
+ upstreamEndpoint: label,
556
+ });
557
+ }
558
+ if (args.dateFiledAfter !== undefined && !DATE_RE.test(args.dateFiledAfter)) {
559
+ throw new ToolErrorCarrier({
560
+ kind: "invalid_input",
561
+ retryable: false,
562
+ message: `Invalid dateFiledAfter ${JSON.stringify(args.dateFiledAfter)} — expected an ISO date (^\\d{4}-\\d{2}-\\d{2}$), e.g. "2020-01-01".`,
563
+ upstreamEndpoint: label,
564
+ });
565
+ }
566
+ if (args.dateFiledBefore !== undefined && !DATE_RE.test(args.dateFiledBefore)) {
567
+ throw new ToolErrorCarrier({
568
+ kind: "invalid_input",
569
+ retryable: false,
570
+ message: `Invalid dateFiledBefore ${JSON.stringify(args.dateFiledBefore)} — expected an ISO date (^\\d{4}-\\d{2}-\\d{2}$), e.g. "2024-12-31".`,
571
+ upstreamEndpoint: label,
572
+ });
573
+ }
574
+ if (args.cursor !== undefined && !COURTLISTENER_CURSOR_RE.test(args.cursor)) {
575
+ throw new ToolErrorCarrier({
576
+ kind: "invalid_input",
577
+ retryable: false,
578
+ message: `Invalid cursor — must be a ≤8192-char URL-safe token. Pass back the _meta.nextCursor from the previous page.`,
579
+ upstreamEndpoint: label,
580
+ });
581
+ }
582
+
583
+ // ── Build query. party → caseName:"…"; natureOfSuit → suitNature:"…" (a REAL
584
+ // docket field, NOT folded into q). Both ride URLSearchParams. ──
585
+ const params = new URLSearchParams();
586
+ const filtersApplied: string[] = [];
587
+ const qParts: string[] = [];
588
+ if (args.party !== undefined && args.party !== "") {
589
+ qParts.push(`caseName:"${args.party}"`);
590
+ filtersApplied.push("party");
591
+ }
592
+ if (args.query !== undefined && args.query !== "") {
593
+ qParts.push(args.query);
594
+ filtersApplied.push("query");
595
+ }
596
+ if (args.natureOfSuit !== undefined && args.natureOfSuit !== "") {
597
+ qParts.push(`suitNature:"${args.natureOfSuit}"`);
598
+ filtersApplied.push("natureOfSuit");
599
+ }
600
+ if (qParts.length > 0) params.set("q", qParts.join(" "));
601
+ if (args.court !== undefined) {
602
+ params.set("court", args.court);
603
+ filtersApplied.push("court");
604
+ }
605
+ if (args.dateFiledAfter !== undefined) {
606
+ params.set("filed_after", args.dateFiledAfter);
607
+ filtersApplied.push("dateFiledAfter");
608
+ }
609
+ if (args.dateFiledBefore !== undefined) {
610
+ params.set("filed_before", args.dateFiledBefore);
611
+ filtersApplied.push("dateFiledBefore");
612
+ }
613
+ params.set("type", "r"); // FIXED — RECAP dockets only
614
+ params.set("order_by", args.order && args.order !== "" ? args.order : DEFAULT_ORDER);
615
+ if (args.cursor !== undefined) {
616
+ params.set("cursor", args.cursor);
617
+ filtersApplied.push("cursor");
618
+ }
619
+
620
+ const url = `https://${COURTLISTENER_HOST}${COURTLISTENER_SEARCH_PATH}?${params.toString()}`;
621
+ const built = new URL(url);
622
+ if (built.hostname !== COURTLISTENER_HOST || built.protocol !== "https:") {
623
+ throw new ToolErrorCarrier({
624
+ kind: "invalid_input",
625
+ retryable: false,
626
+ message: `Constructed CourtListener URL host ${JSON.stringify(built.hostname)} is not ${COURTLISTENER_HOST} over https — refusing to fetch (SSRF safety).`,
627
+ upstreamEndpoint: label,
628
+ });
629
+ }
630
+
631
+ const headers = courtlistenerAuthHeader();
632
+ let body: unknown;
633
+ try {
634
+ body = await getJson<unknown>(url, {
635
+ label,
636
+ headers,
637
+ redirect: "error",
638
+ });
639
+ } catch (e) {
640
+ if (e instanceof SyntaxError) {
641
+ throw driftError(
642
+ label,
643
+ "CourtListener /api/rest/v4/search (type=r) returned a non-JSON body at HTTP 200 — schema drift.",
644
+ );
645
+ }
646
+ if (e instanceof ToolErrorCarrier && e.toolError.upstreamStatus === 400) {
647
+ const apiMsg = await readCourtlistenerErrorMessage(url, headers);
648
+ throw new ToolErrorCarrier({
649
+ kind: "invalid_input",
650
+ retryable: false,
651
+ message: apiMsg
652
+ ? `CourtListener rejected the docket request (HTTP 400): ${apiMsg}. Check the filter parameters.`
653
+ : "CourtListener rejected the docket request (HTTP 400) — check the filter parameters.",
654
+ upstreamStatus: 400,
655
+ upstreamEndpoint: label,
656
+ });
657
+ }
658
+ throw e;
659
+ }
660
+
661
+ const b = (body ?? {}) as { results?: unknown; count?: unknown; next?: unknown };
662
+ if (!Array.isArray(b.results)) {
663
+ throw driftError(
664
+ label,
665
+ "CourtListener /api/rest/v4/search (type=r) shape drift — `results` must be an array.",
666
+ );
667
+ }
668
+ const rawCount = b.count;
669
+ const countIsNumber = typeof rawCount === "number" && Number.isFinite(rawCount);
670
+ if (!countIsNumber && rawCount !== null && rawCount !== undefined) {
671
+ throw driftError(
672
+ label,
673
+ "CourtListener /api/rest/v4/search (type=r) shape drift — `count` must be a number or null.",
674
+ );
675
+ }
676
+
677
+ const dockets = (b.results as unknown[]).map(mapDocket);
678
+ const returned = dockets.length;
679
+ const totalAvailable = countIsNumber ? (rawCount as number) : null;
680
+ const nextCursor = extractNextCursor(b.next, label);
681
+ const hasMore = nextCursor !== null;
682
+
683
+ const notes: string[] = [DOCKET_PROVENANCE_NOTE, COUNT_TOTAL_NOTE];
684
+ if (!countIsNumber) notes.push(DEEP_PAGE_NO_COUNT_NOTE);
685
+ if (args.natureOfSuit !== undefined && args.natureOfSuit !== "") {
686
+ notes.push(DOCKET_SUIT_NATURE_NOTE);
687
+ }
688
+ notes.push(KEYLESS_NOTE);
689
+ notes.push(
690
+ `CourtListener token: ${courtlistenerTokenPresent() ? "present (Authorization: Token … sent; value never logged)" : "absent (keyless; a free COURTLISTENER_API_TOKEN lifts the rate limit)"}.`,
691
+ );
692
+
693
+ return withMeta(
694
+ { dockets },
695
+ {
696
+ source: `${COURTLISTENER_HOST} /api/rest/v4/search (CourtListener (Free Law Project) — US federal court RECAP dockets; PACER (.gov) is paywalled; keyless)`,
697
+ keylessMode: true,
698
+ returned,
699
+ totalAvailable,
700
+ filtersApplied,
701
+ filtersDropped: [],
702
+ fieldsUnavailable: [],
703
+ pagination: { offset: null, limit: returned, hasMore, nextOffset: null },
704
+ nextCursor,
705
+ notes,
706
+ } satisfies Partial<ResponseMeta>,
707
+ );
708
+ }
package/src/keys.ts CHANGED
@@ -159,6 +159,7 @@ export const KEY_REGISTRY: readonly KeyRegistryEntry[] = [
159
159
  envVar: "COURTLISTENER_API_TOKEN",
160
160
  sources: [
161
161
  "CourtListener federal court opinions (courtlistener_search_opinions)",
162
+ "CourtListener RECAP dockets (courtlistener_search_dockets)",
162
163
  ],
163
164
  required: false,
164
165
  signupUrl: "https://www.courtlistener.com/help/api/rest/",
package/src/server.ts CHANGED
@@ -130,7 +130,7 @@ const STATE_BID_FEEDS_POINTER =
130
130
  const SERVER_NAME = "mcp-sam-gov";
131
131
  // Kept in lockstep with package.json / manifest.json / server.json.
132
132
  // Keep in sync with package.json "version" (asserted at release; see CHANGELOG).
133
- const SERVER_VERSION = "1.16.0";
133
+ const SERVER_VERSION = "1.17.0";
134
134
 
135
135
  // ─── Tool input schemas (Zod) ────────────────────────────────────
136
136
 
@@ -4641,11 +4641,16 @@ const LdaSearchFilingsInput = z.object({
4641
4641
  // never results.length; CURSOR pagination (nextCursor extracted from `next`). court/
4642
4642
  // dates charclass-guarded; all filter VALUES ride URLSearchParams; type=o is FIXED.
4643
4643
  const CourtlistenerSearchOpinionsInput = z.object({
4644
+ party: z
4645
+ .string()
4646
+ .min(1)
4647
+ .optional()
4648
+ .describe("Company or person name to match as an ACTUAL PARTY — builds caseName:\"…\" fielded query. A bare company name in `query` matches text mentions (~5,954 for 'Lockheed Martin'); `party` finds cases where the company is actually named as a party (~327). Use `party` for vendor/contractor vetting; use `query` for full-text topic search."),
4644
4649
  query: z
4645
4650
  .string()
4646
4651
  .min(1)
4647
4652
  .optional()
4648
- .describe("Full-text query (maps to q), e.g. 'bid protest' or a party name. Matches across the opinion text/metadata."),
4653
+ .describe("Additional full-text query (maps to q) — topic keywords such as 'False Claims Act' or 'bid protest'. Combined with caseName:\"…\" when `party` is also given. A bare company name here matches text mentions, not actual-party cases — use `party` for that."),
4649
4654
  court: z
4650
4655
  .string()
4651
4656
  .regex(/^[a-z0-9]+$/)
@@ -4678,6 +4683,53 @@ const CourtlistenerSearchOpinionsInput = z.object({
4678
4683
  .describe("Sort order (maps to order_by), default 'dateFiled desc' (most recent first). E.g. 'dateFiled asc', 'score desc'."),
4679
4684
  });
4680
4685
 
4686
+ // ─── CourtListener RECAP dockets (type=r) ────────────────────────
4687
+ // ADR-0064. FCA/qui tam matters are DOCKETS — they rarely produce published opinions
4688
+ // so they are invisible to type=o. suitNature:"…" is a REAL fielded filter on dockets.
4689
+ // Same SSRF / auth / cursor / provenance guards as opinions.
4690
+ const CourtlistenerSearchDocketsInput = z.object({
4691
+ party: z
4692
+ .string()
4693
+ .min(1)
4694
+ .optional()
4695
+ .describe("Company or person name to match as an ACTUAL PARTY — builds caseName:\"…\" fielded query. Use for vendor/contractor due-diligence (FCA, False Claims Act, qui tam). E.g. 'Lockheed Martin' → ~9 FCA dockets."),
4696
+ query: z
4697
+ .string()
4698
+ .min(1)
4699
+ .optional()
4700
+ .describe("Additional free-text keywords (combined with caseName:\"…\" when `party` is given). E.g. 'qui tam' or 'whistleblower'."),
4701
+ natureOfSuit: z
4702
+ .string()
4703
+ .min(1)
4704
+ .optional()
4705
+ .describe("Nature-of-suit filter — builds suitNature:\"…\" fielded query (THIS IS A REAL DOCKET FIELD, not folded into q). E.g. 'False Claims' to find FCA/qui tam dockets. Disclosed in _meta.notes."),
4706
+ court: z
4707
+ .string()
4708
+ .regex(/^[a-z0-9]+$/)
4709
+ .optional()
4710
+ .describe("CourtListener court id (lowercase alphanumerics ^[a-z0-9]+$), e.g. 'gand' (N.D. Ga.), 'flmd' (M.D. Fla.), 'cafc'. Filters to one court."),
4711
+ dateFiledAfter: z
4712
+ .string()
4713
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
4714
+ .optional()
4715
+ .describe("Only dockets filed on/after this ISO date (→ filed_after), e.g. '2015-01-01'."),
4716
+ dateFiledBefore: z
4717
+ .string()
4718
+ .regex(/^\d{4}-\d{2}-\d{2}$/)
4719
+ .optional()
4720
+ .describe("Only dockets filed on/before this ISO date (→ filed_before), e.g. '2024-12-31'."),
4721
+ order: z
4722
+ .string()
4723
+ .min(1)
4724
+ .default("dateFiled desc")
4725
+ .describe("Sort order (maps to order_by), default 'dateFiled desc'. E.g. 'dateFiled asc'."),
4726
+ cursor: z
4727
+ .string()
4728
+ .min(1)
4729
+ .optional()
4730
+ .describe("Opaque continuation token — pass back _meta.nextCursor from the previous page."),
4731
+ });
4732
+
4681
4733
  // ─── US tax-exempt nonprofits (projects.propublica.org) — the nonprofit lane ──
4682
4734
  // ADR-0060. IRS Form 990 public records republished KEYLESS by ProPublica Nonprofit
4683
4735
  // Explorer (a non-profit newsroom) — NOT a .gov API (the IRS has no clean query
@@ -6591,10 +6643,16 @@ export const TOOLS: ToolDef[] = [
6591
6643
  // (nextCursor extracted from `next`, host re-asserted). type=o FIXED.
6592
6644
  defineTool({
6593
6645
  name: "courtlistener_search_opinions",
6594
- description: "Search US federal court opinions via CourtListener (www.courtlistener.com/api/rest/v4/search, type=o). ★PROVENANCE: DATA is US federal court PUBLIC RECORDS; the API is CourtListener (Free Law Project, NON-PROFIT) — NOT a .gov API; the .gov primary source (PACER) is PAYWALLED. KEYLESS (optional free COURTLISTENER_API_TOKEN only raises the rate limit). Filters (all optional): `query` (full-text → q), `court` (^[a-z0-9]+$ — e.g. 'uscfc' US Court of Federal Claims, 'cafc' Federal Circuit, 'scotus'), `dateFiledAfter`/`dateFiledBefore` (ISO YYYY-MM-DD), `natureOfSuit` (folded into q — no verified dedicated filter, disclosed in notes), `cursor` (opaque continuation), `order` (default 'dateFiled desc'). Returns { opinions:[{ caseName, court, courtId, dateFiled, docketNumber, natureOfSuit, status, judge, citation, absoluteUrl }] } + honest _meta. HONESTY: totalAvailable is the API's REAL `count` (total match count) — NOT rows on this page. Pagination is OPAQUE CURSOR (pass _meta.nextCursor back as `cursor`; nextCursor:null/hasMore:false = last page). CourtListener v4 stops counting on deep cursor pages (count:null) → totalAvailable:null DISCLOSED, never faked as results.length. dateFiled is a date STRING; citation → flattened to string/string[]; judge/natureOfSuit/docketNumber null when absent; absoluteUrl is the full CL link. Genuine no-match → honest empty; 400 → invalid_input; 429 → rate_limited (Retry-After honored); 5xx/timeout THROWS; 200 non-JSON/count not number or null → schema_drift; off-host `next` REFUSED (SSRF). Token rides ONLY in the Authorization: Token header.",
6646
+ description: "Search US federal court opinions via CourtListener (www.courtlistener.com/api/rest/v4/search, type=o). ★PROVENANCE: DATA is US federal court PUBLIC RECORDS; the API is CourtListener (Free Law Project, NON-PROFIT) — NOT a .gov API; the .gov primary source (PACER) is PAYWALLED. KEYLESS (optional COURTLISTENER_API_TOKEN only raises the rate limit). Filters (all optional): `party` → caseName:\"…\" FIELDED QUERY — finds actual-party cases (~327 for 'Lockheed Martin'); a bare company name in `query` matches text mentions (~5,954). `query` (free-text → q, AND-ed with caseName when party given). `court` (^[a-z0-9]+$ — e.g. 'uscfc','cafc','scotus'). `dateFiledAfter`/`dateFiledBefore` (ISO). `natureOfSuit` (folded into q — no dedicated filter, disclosed). `cursor`. `order` (default 'dateFiled desc'). Returns { opinions:[{ caseName, court, courtId, dateFiled, docketNumber, natureOfSuit, status, judge, citation, absoluteUrl }] } + honest _meta. HONESTY: totalAvailable is the API's REAL count; CURSOR pagination (pass _meta.nextCursor as cursor); count:null on deep pages → totalAvailable:null DISCLOSED. For FCA/qui tam DOCKETS (rarely produce opinions) use courtlistener_search_dockets instead. Token rides ONLY the Authorization header.",
6595
6647
  inputSchema: CourtlistenerSearchOpinionsInput,
6596
6648
  handler: (input) => courtlistener.searchOpinions(input),
6597
6649
  }),
6650
+ defineTool({
6651
+ name: "courtlistener_search_dockets",
6652
+ description: "Search US federal court RECAP DOCKETS via CourtListener (www.courtlistener.com/api/rest/v4/search, type=r). ★USE THIS for FCA / False Claims Act / qui tam matters — these are DOCKETS, not opinions; settlements rarely produce published opinions. ★PROVENANCE: DATA is US federal court PUBLIC RECORDS; the API is CourtListener (Free Law Project, NON-PROFIT) — NOT a .gov API; the .gov primary source (PACER) is PAYWALLED. KEYLESS. Key filters: `party` → caseName:\"…\" FIELDED (actual-party cases, e.g. 'Lockheed Martin' → ~9 FCA dockets). `natureOfSuit` → suitNature:\"…\" REAL DOCKET FIELD (e.g. 'False Claims' to find FCA/qui tam). `query` (free-text AND-ed with caseName when party also given). `court` (^[a-z0-9]+$). `dateFiledAfter`/`dateFiledBefore` (ISO). `cursor`. `order` (default 'dateFiled desc'). Returns { dockets:[{ caseName, caseNameFull, court, courtId, dateFiled, dateTerminated, docketNumber, natureOfSuit, cause, assignedTo, jurisdictionType, url }] } + honest _meta. dateTerminated is null when case still open (NEVER \"\"). url is the full https://www.courtlistener.com/... docket page URL. Docket = case record; outcome/settlement NOT in it — read docket page or DOJ for that. totalAvailable is the API REAL count; CURSOR pagination. Token rides ONLY Authorization header.",
6653
+ inputSchema: CourtlistenerSearchDocketsInput,
6654
+ handler: (input) => courtlistener.searchDockets(input),
6655
+ }),
6598
6656
  // ━━━ US tax-exempt nonprofits (projects.propublica.org) — the nonprofit lane (2) ━━━ ADR-0060
6599
6657
  // Who a 501(c) org IS (EIN, NTEE, subsection, ruling date, status) + its Form 990
6600
6658
  // FINANCIALS (revenue/expenses/assets/liabilities by year) — the nonprofit/grantee/
package/src/toolsets.ts CHANGED
@@ -195,6 +195,7 @@ export const TOOL_TOOLSET_MAP: Readonly<Record<string, ToolsetName>> = {
195
195
  echo_facility_report: "vetting",
196
196
  epa_tri_facilities: "vetting",
197
197
  courtlistener_search_opinions: "vetting",
198
+ courtlistener_search_dockets: "vetting",
198
199
  nonprofit_search: "vetting",
199
200
  nonprofit_financials: "vetting",
200
201
  lda_search_filings: "vetting",