Koskamo

GLO Law MCP

Provides direct access to over 10 million court opinion records and 2.1 million statute sections for AI assistants. It offers seventeen read-only research tools including keyword, semantic, and name-based case searches, along with citation metadata and opinion snippets. The service is free without an account, though signing in with Google raises usage limits.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

GLO Law MCP logo, by GLO LawVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by GLO Law
MCP endpoint (Streamable HTTP)
https://mcp.glolaw.org/mcp
Vendor documentation

What its tools do

17 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

17 of 17 have a description · 17 of 17 declare behavior hints · 17 of 17 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to glolaw.org ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for cases by name or keyword
  • Perform semantic concept searches on opinion text
  • Retrieve case metadata and citation counts
  • Find similar opinions based on wording overlap

Source and maintenance

Vendor evidenceRegistry 1.0.1

Protocol and capabilities

Server
glolaw-casesearch 0.1.0+defs.b8e8f42810d6
MCP protocol negotiated in check
2025-11-25
Tools
17 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

GLO Law case search: a local, read-only mirror of CourtListener bulk data (10,903,917 opinion records, exact count 2026-10-04), not live CourtListener, with separate point-in-time snapshots of statutes, state and federal regulations, and department of corrections internal policies. There is no write path. Case law ends 2026-09-30 (exact scan of all 10,174,547 case records); a thin result for recent authority reflects that end date. Of the records scanned 2026-07-18, 8,751,062 carry 500+ characters of text, 1,993,069 carry 1-499, and 1,798 carry none (metadata only). Nothing here gives a validity verdict: no "good law" signal, no positive or neutral treatment, not Shepard’s or KeyCite, not legal advice. treatment and brief_check report only where a later court said a case was overruled, abrogated, superseded, reversed or vacated, with that court’s own sentence; automated and unverified, and an absence there means nothing. Statutes and regulations are a different corpus whose risk is currency: each row carries corpus and as_of, and a section amended or repealed after its as_of is returned unchanged. Regulations are loaded per jurisdiction as separate sources (source= on statute and statute_search), never blended; an absent regulation is missing corpus, not evidence about the rule. Department of corrections policies (corrections_policy) are internal policies, not law. Every tool response carries a "note" (and where it applies a "coverage_note") stating that response’s source and limits; a degraded route returns a visible error carrying its coverage_note, never an empty result. Feedback about GLO Law itself (something wrong or missing) goes through a web form a person fills in at https://glolaw.org/feedback?from=connector. No tool sends feedback, and GLO cannot answer questions about a case there. Tools: - search: case names (metadata, not concept). - fts: keyword search of opinion text (exact words, no stemming). - semantic_search: concept search over a partial embedded subset; answers 503 when its embedding service is down. - citation: a reporter citation to its case. cluster and opinion: case detail and full text. similar: wording neighbors. - citations: the cases one opinion cites or that cite it (textual references only); with_passages adds the citing court’s own sentences. - parentheticals: later courts’ one-line descriptions of a case. - treatment: court-reported negative history for one case (cluster id). - brief_check: the citations, quotations and personal identifiers in a supplied document. - statute: exact statute or regulation lookup by citation. statute_search: keyword search of statute and regulation text; results mix states unless jurisdiction= is given. - statute_citing: opinions citing a federal statute section. - corrections_policy: department of corrections policies by number or keyword. - deadline: counts a Kansas court period (K.S.A. 60-206), a KDOC grievance limit (K.A.R. 44-15-101b) or a federal period (FRCP 6, FRAP 26, 28 U.S.C. 2107(a)) from a date, every step beside the rule text; a rule not in the mirror returns no date. - sources: each tool’s full coverage statement and each source’s coverage, citation forms and counts; tool="server" returns the full overview this summary condenses.

Tools

17 advertised

search — Search case names
Advertised by the server during the last successful anonymous check.
Advertised read-only

Case-name metadata search over the local CourtListener mirror. Punctuation-insensitive trigram match on the case name ("Brown v board of education" matches "Brown v. Board of Education"). Returns cluster rows: id, case_name, case_name_short, date_filed, precedential_status, citation_count, slug. Metadata only: no opinion text, and not concept search (it finds a case by its name, not by what it is about). Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Every response carries a "note" stating that response’s source and coverage limits.

search input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "q"
  ],
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "case name or fragment (>=3 chars)"
    },
    "sort": {
      "enum": [
        "citation",
        "date",
        "date_asc"
      ],
      "type": "string",
      "description": "order: citation (default), date, date_asc"
    },
    "court": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 32
      },
      "maxItems": 25,
      "description": "filter to CourtListener court ids (e.g. [\"scotus\",\"ca10\"]); OR within the list"
    },
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "max results, 1-20 (default 20)"
    },
    "date_filed_after": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "only cases filed on/after this date (YYYY-MM-DD)"
    },
    "date_filed_before": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "only cases filed on/before this date (YYYY-MM-DD)"
    },
    "min_citation_count": {
      "type": "integer",
      "minimum": 0,
      "description": "minimum citation_count"
    },
    "precedential_status": {
      "type": "array",
      "items": {
        "enum": [
          "Published",
          "Unpublished",
          "Errata",
          "Separate",
          "In-chambers",
          "Relating-to",
          "Unknown"
        ],
        "type": "string"
      },
      "maxItems": 7,
      "description": "filter by precedential status; OR within the list"
    }
  },
  "additionalProperties": true
}
search annotations
{
  "title": "Search case names",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
fts — Keyword full-text search
Advertised by the server during the last successful anonymous check.
Advertised read-only

Keyword full-text search (BM25) over opinion body text in the local mirror. Keyword, not concept: matches the exact words given (case-insensitive) with no stemming ("petition" does not match "petitions"); all words must appear; "double quotes" mark an exact phrase. A case that states the concept in other words does not appear; semantic_search covers that gap. Coverage (exact scan 2026-07-18): the best extracted text per record is searched; 8,751,062 records carry 500+ characters, 1,993,069 carry 1-499, and 1,798 have no text and cannot match. Returns opinion_id, cluster_id, rank (BM25), case metadata and a matched-text snippet with [hl]...[/hl] around hits. Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Responses carry body_as_of, body_pending (state, exact count, read_at) and body_note, which say when the stored opinion text is older than the case records while a refresh is written; a count that could not be read makes an empty result inconclusive. A cold index may answer 503 briefly; the server retries once. Every response carries a "note" stating that response’s source and coverage limits.

fts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "q"
  ],
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "keywords; all must appear, no stemming; \"quotes\" = exact phrase"
    },
    "court": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 32
      },
      "maxItems": 25,
      "description": "filter to CourtListener court ids (e.g. [\"scotus\",\"ca10\"]); OR within the list"
    },
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "max results, 1-20 (default 20)"
    },
    "date_filed_after": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "only cases filed on/after this date (YYYY-MM-DD)"
    },
    "date_filed_before": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "only cases filed on/before this date (YYYY-MM-DD)"
    },
    "min_citation_count": {
      "type": "integer",
      "minimum": 0,
      "description": "minimum citation_count"
    },
    "precedential_status": {
      "type": "array",
      "items": {
        "enum": [
          "Published",
          "Unpublished",
          "Errata",
          "Separate",
          "In-chambers",
          "Relating-to",
          "Unknown"
        ],
        "type": "string"
      },
      "maxItems": 7,
      "description": "filter by precedential status; OR within the list"
    }
  },
  "additionalProperties": true
}
fts annotations
{
  "title": "Keyword full-text search",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
semantic_search — Concept (semantic) search
Advertised by the server during the last successful anonymous check.
Advertised read-only

Semantic (vector) search over embedded opinion chunks: finds cases by concept or plain-language description when there is no fixed term of art. Returns one row per case: opinion_id, cluster_id, metadata, matched_chunk, distance, similarity, matched_text (the passage the case matched on) and matched_text_status; same_case_other_opinions counts other opinions of the same case, and duplicate_records names a second record holding identical text. Limits: ranking covers only a partial embedded subset of the 10,903,917 opinion records (coverage_note gives it), so relevant authority that is not embedded does not appear; similarity is a relevance signal only, not treatment, validity or "good law"; matched_text is re-derived from the opinion text and present only when that reconstruction agrees with the stored chunk count (about 90% of opinions), otherwise null with matched_text_status giving the reason. A matched_text marks where the match happened, not a holding. Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Degraded state: the route depends on an embedding service that may be down; it then returns a 503 error carrying coverage_note, which means concept search is unavailable, not that nothing matched (fts is a separate route). Every response carries a "note" and a coverage_note. The sources tool returns this tool’s full coverage statement.

semantic_search input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "q"
  ],
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "a concept or plain-language description of the legal issue"
    },
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "max results, 1-20 (default 20)"
    }
  },
  "additionalProperties": true
}
semantic_search annotations
{
  "title": "Concept (semantic) search",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
similar — Similar opinions (keyword overlap)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given one opinion id, returns other opinions whose wording overlaps it, ranked by keyword match (BM25 more-like-this). Keyword overlap only: not a finding that the neighbors address the same issue, reach the same result or remain good law, and not complete. The seed opinion and its own case are excluded. Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Responses carry body_as_of, body_pending (state, exact count, read_at) and body_note, which say when the stored opinion text is older than the case records while a refresh is written; a count that could not be read makes an empty result inconclusive. A cold index may answer 503 briefly; the server retries once. Every response carries a "note" stating that response’s source and coverage limits.

similar input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "description": "seed OPINION id (from a search/fts/semantic result opinion_id)",
      "exclusiveMinimum": 0
    },
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "max results, 1-20 (default 20)"
    }
  },
  "additionalProperties": true
}
similar annotations
{
  "title": "Similar opinions (keyword overlap)",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
citation — Resolve a reporter citation
Advertised by the server during the last successful anonymous check.
Advertised read-only

Resolves a reporter citation "<volume> <reporter> <page>" (e.g. 347 U.S. 483) to the matching case cluster(s) in the local mirror, optionally with member opinions and parallel citations. A 404 means the citation is not in this mirror, not that the case does not exist. A resolved citation shows the case is in the mirror; it is not a good-law, treatment or validity signal. One citation can sit on several records: all are returned up to 25, and capped=true means more records carry it than are shown. Every response carries a "note" stating that response’s source and coverage limits. A miss carries one too.

citation input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "cite"
  ],
  "properties": {
    "cite": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "\"<volume> <reporter> <page>\", e.g. 347 U.S. 483"
    },
    "include": {
      "type": "array",
      "items": {
        "enum": [
          "opinions",
          "citations"
        ],
        "type": "string"
      },
      "description": "extra data to attach: \"opinions\" (member opinions), \"citations\" (parallel cites)"
    }
  },
  "additionalProperties": true
}
citation annotations
{
  "title": "Resolve a reporter citation",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
cluster — Case detail by cluster id
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full case (cluster) detail by cluster id: cluster metadata, member opinions and parallel citations. Metadata only; the opinion tool returns full text. Every response carries a "note" stating that response’s source and coverage limits.

cluster input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "description": "cluster id (from a search/fts/citation result: id or cluster_id)",
      "exclusiveMinimum": 0
    }
  },
  "additionalProperties": true
}
cluster annotations
{
  "title": "Case detail by cluster id",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
opinion — Full opinion text
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full text of one opinion by opinion id, plus metadata. The text is the best stored text extracted from the mirror (HTML stripped; body_source names the extraction source and fallback_used flags a lower-precedence one), bounded to 200k characters with truncated and text_available flags. Not live CourtListener, not legal advice, and no treatment, "good law" or citation-validity status. Responses carry body_as_of, body_pending (state, exact count, read_at) and body_note, which say when the stored opinion text is older than the case records while a refresh is written; a count that could not be read makes an empty result inconclusive. body_pending_note, when present, says whether this text is the older build or not yet written. Every response carries a "note" stating that response’s source and coverage limits.

opinion input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "description": "opinion id (from a search/fts/semantic/similar result opinion_id)",
      "exclusiveMinimum": 0
    }
  },
  "additionalProperties": true
}
opinion annotations
{
  "title": "Full opinion text",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
citations — Citation-graph neighbors
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given one opinion id, lists the cases it cites (direction=authorities) or the cases that cite it (direction=cited_by). Textual reference only: an edge means one opinion’s text names the other; it is not treatment, agreement, validity or "good law", and not a Shepard’s or KeyCite result. At most 1000 references are examined; those resolving to a loaded case are shown (most-cited first), the rest are counted in out_of_corpus_count, and examined_capped=true marks a floor. depth is how often the citing text names the case, not importance. References are per opinion: same_case_opinions gives each opinion of a record its own count and most_references_on names one carrying more (Miranda v. Arizona: record 107252’s combined text 49; lead opinion 9423233, 57,482). also_carried_by names other records sharing the reporter citation, each with its own count; counts are never pooled. The reference table misses citations in the stored text: 22.7% of references on a preregistered sample had no edge (95% interval 18.9-27.0%, n=405), concentrated in some cases, so a thin cited_by list is not evidence a case is rarely cited. with_passages=true (cited_by only) adds citing_passage, the citing court’s own sentence copied verbatim, found only where the citing opinion repeats the reporter citation (first occurrence; at most 10 opinions a request), with passage_note and passage_error. Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Every response carries a "note" and a coverage_note. The sources tool returns this tool’s full coverage statement.

citations input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "description": "seed OPINION id (from a search/fts/semantic/similar result opinion_id)",
      "exclusiveMinimum": 0
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "max in-corpus results, 1-50 (default 25)"
    },
    "direction": {
      "enum": [
        "authorities",
        "cited_by"
      ],
      "type": "string",
      "description": "authorities = cases THIS opinion cites; cited_by = cases that cite THIS one (default cited_by)"
    },
    "with_passages": {
      "type": "boolean",
      "description": "cited_by only: also return each citing court's verbatim sentence around the citation (citing_passage). Adds passage_note, passages_scanned, passages_found, and passage_error when the pass fails or the direction does not support it"
    }
  },
  "additionalProperties": true
}
citations annotations
{
  "title": "Citation-graph neighbors",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
parentheticals — How later courts described this case
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given one opinion id, returns the one-line parentheticals later courts wrote about that case, verbatim. A parenthetical is the later court’s own characterisation: not a holding of the described case, not a summary written by this service, and not treatment, validity or "good law". Each item names the opinion that wrote it (case name, date, citation_count). Near-duplicates ship pre-grouped by CourtListener/FLP (group_id); one row per group is returned (highest score, ties by id; that pick is this service’s, and score has no documented meaning), and group_size counts the lines it stands for. Coverage is partial and skewed toward frequently cited opinions (6,561,861 parentheticals): an empty result means none was extracted for this opinion. At most 2000 are examined a request (examined_capped=true marks a floor); unattributable_in_window counts lines whose author is absent from the mirror. same_case_opinions and most_parentheticals_on name a sibling opinion carrying more (Miranda v. Arizona: 107252 has 1; lead opinion 9423233, 1,524). Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Every response carries a "note" and a coverage_note. The sources tool returns this tool’s full coverage statement.

parentheticals input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "integer",
      "description": "the DESCRIBED opinion id — the case you want later courts' descriptions of (from a search/fts/semantic/similar result opinion_id)",
      "exclusiveMinimum": 0
    },
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "max groups returned, 1-25 (default 10); one representative parenthetical per group"
    }
  },
  "additionalProperties": true
}
parentheticals annotations
{
  "title": "How later courts described this case",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
treatment — Court-reported negative history for one case
Advertised by the server during the last successful anonymous check.
Advertised read-only

Later courts, in their own words, reporting that one case was overruled, abrogated, superseded, reversed or vacated. Takes a cluster id (the case-record id), not an opinion id. Every row carries the citing court’s own sentence, cut from its stored text; the label is a filter over those sentences, not a verdict, and 68.7% of findings are expressly partial ("overruled on other grounds"). Not a validity verdict and not Shepardizing: an automated, unverified reading with no positive signal, so zero rows is not evidence that a case remains good law. Rows include known false positives; a read guard (version 2) withholds ten known false shapes and counts them in declined_by_read_guard with read_guard_note. Precision, hand-read after version 2: 0.9862 (95% interval 0.9511-0.9962, 145 of 150 kept rows); 1.0000 (0.9124-1.0000, 40 of 40) for cases cited 10,000+ times. Recall for this collection is unknown; the only figure, 0.6477 (0.5780-0.7116, n=193), is an upper bound on the Supreme Court stratum. The overruling opinion itself is usually not among the rows (Roe carries no row from Dobbs). Five labels only; "followed" and "distinguished" are not loaded. Counts are for this record alone; also_carried_by names sibling records. unrelayable_in_window counts rows dropped because no sentence could be cut; capped=true marks a slice; order is citing-opinion date. Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Every response carries a "note" and a coverage_note. The sources tool returns this tool’s full coverage statement.

treatment input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "cluster_id"
  ],
  "properties": {
    "label": {
      "enum": [
        "overruled",
        "abrogated",
        "superseded",
        "reversed",
        "vacated"
      ],
      "type": "string",
      "description": "filter rows to one label. A filter over sentences, never a verdict; by_label on the response reports all five regardless"
    },
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "max rows returned, 1-25 (default 10)"
    },
    "offset": {
      "type": "integer",
      "maximum": 5000,
      "minimum": 0,
      "description": "skip this many, for paging further down the date order; capped at 5000"
    },
    "cluster_id": {
      "type": "integer",
      "description": "the CASE RECORD (cluster) id of the case you are checking — from a search/citation/fts result (id or cluster_id), not an opinion id",
      "exclusiveMinimum": 0
    }
  },
  "additionalProperties": true
}
treatment annotations
{
  "title": "Court-reported negative history for one case",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
brief_check — Check every citation in a document
Advertised by the server during the last successful anonymous check.
Advertised read-only

Checks the case citations in a document the user supplies (a draft filing, brief or motion) against this collection and court-reported negative history, showing which cited cases to read before filing. Nothing is ever cleared: there is no pass mark or "verified" state. Per citation: reported_negative_history (a later opinion’s sentence matched as reporting it overruled, abrogated, superseded, reversed or vacated, in records[].reported_by; unverified, with known false positives), no_row_found (nothing found, not a clearance), not_in_collection (echoed as written, never corrected or remapped). Short forms (Id., supra, bare names) are counted in short_form_counts, not checked; statutes, rules and secondary sources are not checked. quotes[]: quoted words near a citation compared with the stored text, status found (pin cite and support not checked), not_found_in_stored_text (with stored_passage and agrees_for_words; not a finding of invention), no_text_stored or not_checked; block quotations are not checked; the join is a nearest-neighbour guess (attribution_method, attribution_distance). protected_info: a pattern scan for identifiers court rules bar from public filings (Fed. R. Civ. P. 5.2(a), Kan. S. Ct. R. 24(b)), values masked, with category, rule_refs and offsets; a finding is not a ruling, zero findings is not a clearance, and not_detectable lists what it cannot see. Bounds: 200 citations, 25 detailed flags (flagged_without_detail), citations_truncated, multiple_records, zero_result_detail. The document is not stored or logged. Negative-history limits are those of the treatment tool. Case law in this mirror ends 2026-09-30 (exact scan of all 10,174,547 case records): a thin or empty result for recent authority means the collection ends there, not that no such case exists. Every response carries a "headline", a "note" and a coverage_note. The sources tool returns this tool’s full coverage statement.

brief_check input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "text"
  ],
  "properties": {
    "text": {
      "type": "string",
      "maxLength": 380000,
      "minLength": 1,
      "description": "the document text to check, as plain text. Up to 380,000 characters; a longer document is refused with a reason rather than silently cut, because a check run on part of a filing says nothing about the rest"
    }
  },
  "additionalProperties": true
}
brief_check annotations
{
  "title": "Check every citation in a document",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
statute — Statute section by citation
Advertised by the server during the last successful anonymous check.
Advertised read-only

Exact lookup of one statute section or one regulation section by citation, in a point-in-time snapshot of published law. Returns the text verbatim with jurisdiction, corpus, citation, heading, path, source_url, as_of, act_status, last_amended_year and repaired. Enacted text only: not case law or annotations, no treatment or "good law" judgment, and nothing in a result means the text is current; as_of on each row is its snapshot date. Default source: 2,123,652 rows in four snapshots, never blended (state statutes from open-us-law 2026.08, as_of 2026-08-14; state statutes from Justia 2019-2021 where the newer snapshot lacks the section, with GA, NC, PR and VI Justia-only; the United States Code; and 9,888 Kansas Administrative Regulations from the 2022 bound edition). source=<code> reaches one regulation source (cfr for federal, or a state code), each with its own note, coverage_note, defect floor, held units and citation form, never mixed with another. Regulations outside the loaded sources are absent from this mirror, which says nothing about whether a rule exists. A miss is not an absence: structured_lookup_supported=false means that lookup form cannot match for the jurisdiction, and cite_normalized and cite_forms_tried report the forms tried. Row flags: ends_at_colon (text stopping where a table or list is announced; its absence does not show the text is whole), page_overlap_repeats_removed (raw=true returns the stored text unchanged), last_amended_year_older_than_text. A held unit answers kind "held" with its reasons and no text. Every response, including 400 and 404, carries "note" and "coverage_note". The sources tool returns this tool’s full coverage statement and, per source code, its coverage, citation forms, served and held counts and read dates.

statute input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "raw": {
      "type": "boolean",
      "description": "statutes only: true returns the stored text unchanged, without the page-overlap repeat removal"
    },
    "cite": {
      "type": "string",
      "maxLength": 200,
      "minLength": 3,
      "description": "full citation as published, e.g. \"KRS § 11A.001\" (2026-08-14 rows, no year), \"KS Stat § 1-201 (2021)\" (Justia rows), or \"K.A.R. 1-1-1\" (Kansas regulations, no section sign) — the reliable form for every jurisdiction"
    },
    "title": {
      "type": "string",
      "maxLength": 32,
      "description": "optional title or chapter number narrowing a jurisdiction+section lookup; with source=\"cfr\" the CFR title, required with section; for other sources the forms are given by sources(tool=\"statute\", source=<code>)"
    },
    "source": {
      "enum": [
        "cfr",
        "il",
        "nm",
        "oh",
        "wi",
        "va",
        "pa",
        "ga",
        "nc",
        "wa",
        "ky",
        "nv",
        "ri",
        "ct",
        "md",
        "mn",
        "ak",
        "la",
        "ia",
        "sc",
        "me",
        "nd",
        "fl",
        "ut",
        "mo",
        "id",
        "nh",
        "or",
        "co",
        "hi",
        "ar",
        "sd",
        "al",
        "nj",
        "mi",
        "ms",
        "ca",
        "ny",
        "wv",
        "wy",
        "de",
        "ne",
        "mt",
        "tx",
        "az",
        "tn",
        "in",
        "ok",
        "ma",
        "vt"
      ],
      "type": "string",
      "description": "omit for statutes and Kansas regulations; a regulation source code (\"cfr\" for federal, or a state code) reaches that source alone; each code’s coverage and citation forms are given by sources(tool=\"statute\", source=<code>)"
    },
    "section": {
      "type": "string",
      "maxLength": 64,
      "description": "section number as the publisher prints it, e.g. \"21-6614\", \"11A.001\", or a Kansas regulation number \"1-1-1\"; requires jurisdiction. Justia rows carry none, so this can never match one of them"
    },
    "jurisdiction": {
      "type": "string",
      "maxLength": 8,
      "description": "jurisdiction code, e.g. \"us\" or \"ks\"; requires section. Resolves for the federal slice, for 2026-08-14 state rows and for the Kansas regulation rows (Justia-only GA/NC/PR/VI never match this way)"
    }
  },
  "additionalProperties": true
}
statute annotations
{
  "title": "Statute section by citation",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
statute_search — Keyword search over statute text
Advertised by the server during the last successful anonymous check.
Advertised read-only

Keyword (BM25) search over the body text of statute sections and, in the default source, Kansas administrative regulations, in the same snapshot as the statute tool; source=<code> searches one regulation source alone. Without jurisdiction=, results mix states: on 6,852 benchmark housing-law questions run unconfined, the top-ranked section came from a state other than the asker’s in 97.7% of them. Each row carries its jurisdiction, corpus and as_of; statute and regulation rows can appear together. Rank is textual match strength only. Keyword, not concept, with no stemming: very common words are dropped, duplicates collapse, at most 40 words run, matched any-of, so a top hit may share one word with the query; terms_searched and terms_dropped report what ran, and "double quotes" require a phrase. Only the body is searched, not the heading. Scores drift in their last digits between restarts, so close rows can swap places. Returns metadata, a snippet with [hl]...[/hl] marks and a rank; the statute tool returns the full section. A section not returned is a miss, not an absence. ends_at_colon is flagged as in the statute tool. A missing keyword index returns a visible 503, not zero matches. Every response, including 400 and 503, carries "note" and "coverage_note". The sources tool returns this tool’s full coverage statement and, per source code, its coverage and counts.

statute_search input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "q"
  ],
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 1000,
      "minLength": 1,
      "description": "words to match in the statute section text. A full natural-language question is fine: common words are dropped and the rest matched ANY-OF, so more words widen the search rather than narrowing it. \"double quotes\" for a phrase that must appear together"
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "max results, default 20, capped at 50"
    },
    "title": {
      "type": "string",
      "pattern": "^(?:\\d{1,4}(?:\\.\\d{1,2})?[A-Za-z]?|\\d{4}-\\d{1,2}(?:-\\d{1,2})?|\\d{1,4}:\\d{1,3}|[A-Za-z][A-Za-z -]{0,23})$",
      "description": "only with source=: narrows the search to one title, part or chapter of that source; the forms per source are given by sources(tool=\"statute_search\", source=<code>)"
    },
    "source": {
      "enum": [
        "cfr",
        "il",
        "nm",
        "oh",
        "wi",
        "va",
        "pa",
        "ga",
        "nc",
        "wa",
        "ky",
        "nv",
        "ri",
        "ct",
        "md",
        "mn",
        "ak",
        "la",
        "ia",
        "sc",
        "me",
        "nd",
        "fl",
        "ut",
        "mo",
        "id",
        "nh",
        "or",
        "co",
        "hi",
        "ar",
        "sd",
        "al",
        "nj",
        "mi",
        "ms",
        "ca",
        "ny",
        "wv",
        "wy",
        "de",
        "ne",
        "mt",
        "tx",
        "az",
        "tn",
        "in",
        "ok",
        "ma",
        "vt"
      ],
      "type": "string",
      "description": "omit for statutes and Kansas regulations; a regulation source code (\"cfr\" for federal, or a state code) searches that source alone; each code’s coverage is given by sources(tool=\"statute_search\", source=<code>)"
    },
    "jurisdiction": {
      "type": "string",
      "maxLength": 8,
      "description": "restrict to one jurisdiction, e.g. \"ks\" or \"us\". STRONGLY preferred when the user’s state is known: without it results mix states"
    }
  },
  "additionalProperties": true
}
statute_search annotations
{
  "title": "Keyword search over statute text",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
statute_citing — Opinions citing a federal statute section
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists the opinions whose text cites one U.S. Code section. Federal only: no state statute-citation links exist, and a state citation returns a visible error. An entry means the opinion’s text names the section; it does not say how the court treated it and carries no treatment, validity or "good law" judgment. Zero results is the majority outcome: only 25,093 of 60,444 parseable federal sections (41.5%) have any extracted citing opinion, so an empty list is not evidence that no case cites the statute. Order is most recently filed first and nothing else. The scan covered 10,745,929 opinion records and predates the 2026-09-30 refresh. Every figure is a lower bound with named extraction gaps (no section marker, subsections dropped, only the first section of a list, letter-suffixed sections, ranges). A trailing subsection given is stripped and reported in subsection_dropped. Resolution rates: occurrence-level 0.8870, distinct-pair 0.1697; resolution is not correctness. Precision on a 120-span blind sample: 0.9845 (90% Wilson 0.9526-0.9950); the second extractor alone 0.8667 (0.7785-0.9232); recall unmeasured. parentheticals[] carries any court-written parenthetical verbatim (95.8% of citations have none). section_in_snapshot=false with snapshot_detail marks a section absent from the U.S. Code snapshot; the citation is shown as written, never remapped. Every response, including 400 and 503, carries "note" and "coverage_note". The sources tool returns this tool’s full coverage statement.

statute_citing input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "cite": {
      "type": "string",
      "maxLength": 200,
      "description": "federal citation as published, e.g. \"42 U.S.C. § 1983\". A trailing subsection is stripped and reported in subsection_dropped. State citations are refused with a visible error"
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "max citing opinions returned, default 25, capped at 50"
    },
    "title": {
      "type": "string",
      "maxLength": 8,
      "description": "U.S. Code title, e.g. \"42\"; used with section= in place of cite="
    },
    "offset": {
      "type": "integer",
      "maximum": 5000,
      "minimum": 0,
      "description": "skip this many, for paging further down the date order; capped at 5000"
    },
    "section": {
      "type": "string",
      "maxLength": 64,
      "description": "U.S. Code section number, e.g. \"1983\" or \"1997e\". Use with title="
    }
  },
  "additionalProperties": true
}
statute_citing annotations
{
  "title": "Opinions citing a federal statute section",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
corrections_policy — Department of corrections internal policies (NOT law)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Internal policies of a state department of corrections, or of the Federal Bureau of Prisons (state="bop", federal), as the department posts them, by number or by keyword search (query; no stemming). Not law: not statutes, regulations or court rules (a Maine policy the department marks as adopted as a rule answers apa_marked true; Kentucky’s policies are adopted by reference in its regulations, 501 KAR 6, in a dated edition the served copy may not match). A department can change its policies without notice, and policies it does not post are not here. An answer gives the number, title, the dates the file prints, the version replaced where the file names one, the date GLO read the file, and the department’s coverage_note; a revoked policy is listed with the successor its notice names; a number the department lists but does not post answers not posted; a held number answers its status and reason, never text. Departments loaded: one code each in the state enum, among them "ks-go" (Kansas facility General Orders); many are partial, with served and held counts per department. "hi" (Hawaii) serves text for only 40 of 204 posted files, machine-read with no human read; every other row of its list answers its reason, never text. A state absent from the enum is not loaded, which says nothing about whether its department has such a policy. The sources tool returns, per state code, the department’s source, read date, served and held counts, held reasons and number forms. Give number or query, not both.

corrections_policy input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "state"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "max search results, default 20, capped at 50 (search only)"
    },
    "query": {
      "type": "string",
      "maxLength": 400,
      "description": "words to match in the policies’ text (keyword, no stemming). Give number or query, not both"
    },
    "state": {
      "enum": [
        "va",
        "ca",
        "il",
        "nm",
        "me",
        "vt",
        "sc",
        "ct",
        "tx",
        "ia",
        "or",
        "de",
        "ri",
        "mt",
        "dc",
        "ks",
        "ks-go",
        "nc",
        "ga",
        "wa",
        "ak",
        "in",
        "pa",
        "ne",
        "ky",
        "ny",
        "ok",
        "az",
        "nh",
        "mi",
        "oh",
        "mn",
        "sd",
        "co",
        "bop",
        "ar",
        "tn",
        "ma",
        "md",
        "wi",
        "wy",
        "ut",
        "id",
        "al",
        "hi",
        "wv",
        "nv",
        "la"
      ],
      "type": "string",
      "description": "the department: a state code (e.g. \"va\", \"ks\", \"ks-go\" for Kansas facility General Orders) or \"bop\" (the Federal Bureau of Prisons); each code’s department and coverage are given by sources(tool=\"corrections_policy\", source=<code>)"
    },
    "number": {
      "type": "string",
      "maxLength": 200,
      "description": "a procedure, section, directive or policy number as the department prints it, e.g. \"851.1\", \"OP 038.1\", \"01-103D\" (Kansas), \"TCF 15-101\" (a Kansas facility General Order); number \"contents\" lists a department’s files where its coverage says so; the forms per department are given by sources(tool=\"corrections_policy\", source=<code>)"
    }
  },
  "additionalProperties": true
}
corrections_policy annotations
{
  "title": "Department of corrections internal policies (NOT law)",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
deadline — Count a deadline from a rule
Advertised by the server during the last successful anonymous check.
Advertised read-only

Counts a deadline from a date the user gives, under a rule whose text is in GLO’s mirror, and returns every counting step beside that text. Counted: K.S.A. 60-206 (Kansas civil procedure; a period in days the user supplies from the rule or order that sets it, forward or backward, with three days added after service by mail or by leaving it with the clerk) and K.A.R. 44-15-101b (Kansas Department of Corrections grievances: 15 days from discovery excluding Saturdays, Sundays and holidays, never later than one year after the event), Fed. R. Civ. P. 6 and Fed. R. App. P. 26 (federal civil and appellate time, a period in days the user supplies, with the three days 6(d) and 26(c) add) and 28 U.S.C. 2107(a) (thirty days after entry, counted by FRAP 26(a)). Where the text can be read more than one way, each reading is counted with its own date and earliest is the date safe under every reading. Not counted: periods in hours. The Kansas Supreme Court’s holiday orders are held for 2025 to 2027 only, counted for K.S.A. 60-206 as one reading beside a reading without them; other orders, days declared by order, and states’ holidays other than Kansas’s list are not in the mirror. Returns status, readings (id, label, date, steps), earliest, latest, warnings (each applies to the date given), the rule row (citation, verbatim text, corpus, as_of, source_url, ambiguities, exceptions, last_verified), detail, query and a note. Pure computation from the stored rule text, with no database query. Counting is information, not legal advice. The sources tool returns this tool’s full coverage statement.

deadline input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "rule",
    "start_date"
  ],
  "properties": {
    "days": {
      "type": "integer",
      "description": "ks-60-206, frcp-6 and frap-26: the period in days, 1 to 3650, from the rule or order that sets it (usc-28-2107-a: omit, or 30)"
    },
    "rule": {
      "enum": [
        "ks-60-206",
        "kar-44-15-101b",
        "frcp-6",
        "frap-26",
        "usc-28-2107-a"
      ],
      "type": "string",
      "description": "the rule: \"ks-60-206\" (K.S.A. 60-206), \"kar-44-15-101b\" (K.A.R. 44-15-101b), \"frcp-6\" (Fed. R. Civ. P. 6), \"frap-26\" (Fed. R. App. P. 26) or \"usc-28-2107-a\" (28 U.S.C. 2107(a), thirty days after entry)"
    },
    "service": {
      "enum": [
        "mail",
        "clerk",
        "electronic",
        "personal",
        "other"
      ],
      "type": "string",
      "description": "ks-60-206, frcp-6 and frap-26: how the paper was served. ks-60-206: \"mail\" and \"clerk\" add three days; frcp-6: those and \"other\" (two readings: consented to in writing or not); frap-26: all but \"electronic\" and \"personal\""
    },
    "direction": {
      "enum": [
        "after",
        "before"
      ],
      "type": "string",
      "description": "ks-60-206, frcp-6 and frap-26: \"after\" (default) or \"before\" the start date"
    },
    "event_date": {
      "type": "string",
      "maxLength": 10,
      "description": "kar-44-15-101b only, required: YYYY-MM-DD, the day of the event itself (the one-year limit)"
    },
    "start_date": {
      "type": "string",
      "maxLength": 10,
      "description": "YYYY-MM-DD: for ks-60-206, frcp-6 and frap-26 the day the period runs from (or the event it counts back from); for kar-44-15-101b the day the event was discovered; for usc-28-2107-a the day of entry"
    }
  },
  "additionalProperties": true
}
deadline annotations
{
  "title": "Count a deadline from a rule",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
sources — Coverage and citation formats by source
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns GLO’s coverage statements as text, so each tool’s and each source’s limits can be read on request. With a tool name alone: that tool’s full statement of coverage, measured limits and field meanings ("server" gives the full server overview). With a source or state code: for statute and statute_search, that regulation source’s coverage, citation forms, served and held counts and read dates (e.g. "cfr", "fl", "de"); for corrections_policy, that department’s (e.g. "ks", "bop"). Returns tool, source, text, argument_descriptions, sources_available and a note. Read-only and served from the tool layer itself, with no database query. Each data tool’s own response note and coverage_note remain the record for that response.

sources input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "tool"
  ],
  "properties": {
    "tool": {
      "enum": [
        "search",
        "fts",
        "semantic_search",
        "similar",
        "citation",
        "cluster",
        "opinion",
        "citations",
        "parentheticals",
        "treatment",
        "brief_check",
        "statute",
        "statute_search",
        "statute_citing",
        "corrections_policy",
        "deadline",
        "server"
      ],
      "type": "string",
      "description": "a tool name, or \"server\" for the full server overview"
    },
    "source": {
      "type": "string",
      "maxLength": 8,
      "minLength": 1,
      "description": "optional: a regulation source code for statute or statute_search (e.g. \"cfr\", \"fl\"), or a department code for corrections_policy (e.g. \"ks\", \"bop\")"
    }
  },
  "additionalProperties": true
}
sources annotations
{
  "title": "Coverage and citation formats by source",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
679 ms
95th percentile latency
679 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 679 ms · metadata changed · 17 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http glo-law-mcp https://mcp.glolaw.org/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add glo-law-mcp --url https://mcp.glolaw.org/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable glo-law-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "glo-law-mcp": {
      "url": "https://mcp.glolaw.org/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "glo-law-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.glolaw.org/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start glo-law-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "glo-law-mcp": {
      "type": "http",
      "url": "https://mcp.glolaw.org/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http glo-law-mcp https://mcp.glolaw.org/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.glolaw.org/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "glo-law-mcp": {
      "serverUrl": "https://mcp.glolaw.org/mcp"
    }
  }
}

Let your agent find its tools

Find servers like GLO Law MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run GLO Law MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing