Connecting your own AI to this case search
The same search this site runs in your browser is also built as a research interface an AI client can call directly, using the Model Context Protocol. This page says what that interface is, what its eleven tools return, what every answer has to carry with it, and which parts of it you can reach today.
Read this before you connect anything
- This is not a citator. Nothing here tells you whether a case is still good law, was overruled, limited, reversed, or followed. There is no such signal anywhere in this collection, and an AI that implies one is inventing it.
- This is a stored copy, not a live service. It is a read-only mirror of CourtListener bulk data, 10,745,929 opinion records, and it is not live CourtListener. Statute sections are a separate point-in-time snapshot with no amendment or repeal signal at all.
- The case law stops on 31 March 2026. Filing dates run continuously up to that date and then end. A case decided after it is not in this collection and will not appear no matter how you search, so a thin or empty result about anything recent means the collection ends there, not that no such case exists. Check the last several months somewhere else. That is the date the cases were filed, and it is a different thing from the 2026-07-18 text scan quoted below, which only says when the stored text was measured. The statute sections are a separate collection with their own, much older dates.
- It misses things, including things that would help you. A search returning nothing is a miss, never proof that no such case or statute exists.
- Every tool response carries a
note, and some carry acoverage_note. Those are data, not decoration. An AI client is expected to pass them on to you word for word. Anything that quietly drops them to sound more confident is the exact failure this whole interface is built to prevent, because the people using it are often representing themselves and a confident wrong answer is what gets them hurt. - This is not legal advice, and connecting an AI to it does not make it legal advice.
The remote endpoint
The interface has two faces over one shared tool layer. The remote face speaks MCP Streamable HTTP and is the one you point a hosted AI client at. It is at:
https://mcp.glolaw.org/mcp
Read this part before you spend time on it: the endpoint answers, but the sign-in in front of it is not finished, so no outside client can complete a connection yet. A request without a valid Cloudflare Access assertion is refused, and right now nothing is issuing one. If you point a client at the address today you will get a refusal, and that refusal is the gate working rather than a fault in your setup. The address is printed here so you can see what is coming and check it later, not because it is usable now.
When the sign-in is finished it will be invite-only during the beta, so the address answering will still not be the same as your client being allowed in. Nothing about reaching this endpoint changes any limit on this page: the same eleven tools, the same missing coverage, the same absence of any good-law signal.
The local face, and who it is actually for
The other face speaks MCP over stdio and works today. Be clear about what that means: it is a thin adapter that talks to the search service running on the same machine as the corpus. It does not carry the collection with it, and it does not dial out to anything. So it is usable if you are running the whole stack yourself, and it is not a way for a reader on the internet to reach this mirror. Until the remote sign-in is finished, the browser search on this site is the way in.
For a client on the same machine, the server entry looks like this. The adapter holds the internal service secret and forwards it itself; the AI client never sees the database, the SQL, or the secret, and there is no write path in any tool.
{
"mcpServers": {
"glolaw-casesearch": {
"command": "node",
"args": ["<path-to>/casesearch-mcp/index.mjs"],
"env": {
"CASESEARCH_BASE": "http://127.0.0.1:8787",
"CASESEARCH_PROXY_SECRET_FILE": "<path-to>/casesearch_proxy_secret.txt"
}
}
}
}The eleven tools
Every one of them is read-only. Both faces expose the same eleven, defined once and shared word for word, so a tool behaves identically whichever way you reach it. The right-hand column is not fine print: it is the limit the tool itself reports on every call, and an AI client is expected to repeat it rather than summarise it away.
search
Finds cases by name. Punctuation-insensitive match on the case name, returning case metadata: id, name, date filed, precedential status, citation count.
Limit to carry: Metadata only, no opinion text, and not concept search. It finds a case by what it is called, never by what it is about. Nothing filed after 31 March 2026 is here to be found.
fts
Keyword search (BM25) over the stored opinion text. Returns the opinion id, its case metadata, a relevance rank, and a snippet with the matched words marked.
Limit to carry: Exact words with no stemming, so “petition” will not match “petitions”, and every word has to appear. A case that makes the same argument in different words will not come back. It searches the best extracted text held per record: 8,751,062 records carry 500 or more characters, 1,993,069 carry 1 to 499, and 1,798 have no text and cannot match at all. Nothing filed after 31 March 2026 is searchable here at all; that is the filing cutoff, and the 2026-07-18 scan date is only when the stored text was measured.
semantic_search
Concept search. Ranks opinions whose meaning is close to a plain-language description, covering the gap keyword search leaves. Returns one row per case with the passage the case matched on.
Limit to carry: Ranking runs over a partial embedded subset of the 10,745,929 records, so relevant authority that was never embedded cannot appear at any position, for any search, and nothing filed after 31 March 2026 is in the collection to be embedded in the first place. Similarity is a signal, not treatment or validity. The matched passage is re-derived rather than stored and is sometimes absent, which is stated rather than filled in. This route depends on an embedding service that can be down; when it is, the call returns a visible 503 carrying its coverage note. That is an outage, and an AI client must say so instead of reporting “no results found”.
similar
Given one opinion, returns other opinions whose wording overlaps it, ranked by keyword match.
Limit to carry: Wording overlap only. It is not a check that the neighbours address the same issue, reach the same result, or remain good law, and it is not a completeness guarantee. No neighbour filed after 31 March 2026 can be returned, because none is in the collection.
citation
Resolves a reporter citation such as 347 U.S. 483 to the matching case in the mirror, optionally with its member opinions and parallel citations.
Limit to carry: A miss means the citation is not in this mirror, not that the case does not exist. Resolving one confirms the case is here; it is not a good-law, treatment, or validity signal.
cluster
Full case detail by case id: case metadata, the opinions filed in it, and parallel citations.
Limit to carry: Metadata only. Opinion text comes from the opinion tool.
opinion
The full stored text of one opinion, plus its metadata, with flags naming which source the text was extracted from and whether it was truncated.
Limit to carry: This is stored text, not live CourtListener, not legal advice, and it carries no treatment or good-law status of any kind.
citations
Given one opinion, lists the cases it cites, or the cases that cite it.
Limit to carry: A textual reference only: an edge means one opinion’s text names the other. It does not say the citing court followed, distinguished, criticised, or overruled it, and it is not a Shepardize or KeyCite result. It is a bounded sample of a partial mirror: at most 1000 references are examined, the ones resolving to a loaded case are shown, and the rest are only counted. Treat the result as a floor, never a total. It is also blind to anything filed after 31 March 2026, so the most recent five months of citing opinions are missing from every cited_by answer.
statute
Exact lookup of one statute section by citation, returning the section text verbatim with its jurisdiction, corpus, heading, path, source link where one exists, its as-of date, and the publisher’s own status and last-amended fields where the publisher supplies them.
Limit to carry: Three snapshots sit side by side and are never blended, so every row carries its own corpus and as-of date. Of 2,113,764 sections, 1,767,375 (83.6%) are state law from the open-us-law 2026.08 release with an as-of date of 14 August 2026; 285,919 (13.5%) are state law from a 2019–2021 Justia release, kept only where the newer snapshot lacks the section (Georgia, North Carolina, Puerto Rico and the Virgin Islands are Justia-only); 60,470 are the United States Code. A section amended or repealed after its as-of date comes back unchanged; the status field on 2026 rows is the publisher’s, not a finding of this tool. The source link is empty for every Arkansas, Mississippi, New Mexico and Tennessee row and every Justia row. Two citation formats are stored (2026 rows carry no year, Justia rows do), so a miss may be the other format. A miss is never an absence. Statute text from the 2026 release derives from open-us-law (CC BY 4.0). Some sections stop at a colon, at the point where they announce a fee table, a form, a compact or a list that then does not appear: 451 of the 2,113,764 come back with an ends-at-colon flag and a note saying so. In a hand-read of 25 of them, fixed in advance, 19 were missing the material the section announced, 5 stopped where the publisher’s own page stops, and 1 had its body filed under neighbouring section numbers. The flag catches only text that stops on a colon, so its absence is not evidence that a section’s text is whole.
statute_search
Keyword (BM25) search over the body text of statute sections, returning metadata, a rank, and a snippet.
Limit to carry: Without a jurisdiction it returns the wrong state’s law almost every time. Measured, not estimated: across 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. The query is also not run as typed: common words are dropped, at most 40 words survive, and those are matched any-of, so a top hit can share a single word with the question and answer nothing. The heading is not searched. Results can mix the 2026 and 2019–2021 vintages in one list; read the corpus and as-of date on every row. Same currency limits as the statute tool, and the same ends-at-colon flag: a result whose stored text stops at a colon carries the flag and its note, and the absence of the flag is not evidence that a section’s text is whole.
statute_citing
Given a section of the federal code, lists the opinions in the mirror whose text cites it, most recently filed first, with any explanatory parenthetical the court wrote at that citation relayed word for word.
Limit to carry: This is not Shepardizing, and an empty list is not a finding. An entry means an opinion’s text names the section, never that the court applied, upheld, or struck it down. Getting nothing back is the ordinary outcome, not the rare one: only 25,093 of the 60,444 federal sections here, about 41.5%, have any citing opinion that could be extracted, so an empty list means the extraction missed it rather than that no case cites the statute. Six known extraction gaps sit under every number, including citations written without a section symbol, dropped subsections, only the first section of a list surviving, and ranges never matching. Federal code only: there are no statute-citation links for state law anywhere in this collection, so a state citation returns a visible error instead of an empty list. The order is by date and nothing else, so the first result is not the best one. Where a section is not in the current federal snapshot it is reported as not present and shown exactly as it was written, never swapped for a successor.
What a failure looks like
When a route is degraded it says so out loud. Concept search depends on a service that can be down, and when it is, the call comes back as a visible error carrying its coverage note. It never comes back as an empty result set, because an empty result set reads like “there is nothing on this” and that would be a lie. If your AI reports no results at a moment when the route was actually unavailable, that is your client swallowing the error, not the corpus answering.
The same rule runs through everything here. A citation that does not resolve is reported as not present in this mirror, shown exactly as it was written, never quietly swapped for something that does resolve. Counts that are bounded samples are labelled as floors. The figures on this page and on the limitations page come from full scans rather than estimates, and where a number could only be measured as a lower bound it is published as one.