Syfert Legal Research
REMOTE · MCP.SYFERT.COM · SCANNED SEP 26
Verify legal citations, case treatment, quotes and whole briefs against 10.7M U.S. opinions
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security69
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS enforcement could not be verified: the plaintext port answered with HTTP 405, which proves neither a plaintext path nor enforcement. View diagnostics → Unverified
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability62
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 6542 tokens (~436/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management53
- Stability observed for 16 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the Syfert Legal Research MCP server?
Syfert Legal Research is a hosted endpoint at https://mcp.syfert.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.syfert.com
claude mcp add --transport http com-syfert-legal-research 'https://mcp.syfert.com/mcp'
{
"mcpServers": {
"com-syfert-legal-research": {
"url": "https://mcp.syfert.com/mcp"
}
}
} {
"servers": {
"com-syfert-legal-research": {
"type": "http",
"url": "https://mcp.syfert.com/mcp"
}
}
} [mcp_servers.com-syfert-legal-research] url = "https://mcp.syfert.com/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-syfert-legal-research": {
"type": "remote",
"url": "https://mcp.syfert.com/mcp",
"enabled": true
}
}
} openclaw mcp add com-syfert-legal-research --url 'https://mcp.syfert.com/mcp' --transport streamable-http
mcp_servers:
com-syfert-legal-research:
url: "https://mcp.syfert.com/mcp" {
"McpServers": {
"com-syfert-legal-research": {
"Transport": "http",
"Url": "https://mcp.syfert.com/mcp"
}
}
} assistant mcp add com-syfert-legal-research -t streamable-http -u 'https://mcp.syfert.com/mcp'
{
"mcpServers": {
"com-syfert-legal-research": {
"type": "http",
"url": "https://mcp.syfert.com/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 26 Sept 26 +11
- Judged manipulation: unverified → pass ▲ security
- Tool “check_brief” rewrote its description, which is the text the model reads security
- Tool “check_citation” rewrote its description, which is the text the model reads security
- Tool “get_case” rewrote its description, which is the text the model reads security
- Tool “get_propositions” rewrote its description, which is the text the model reads security
- Tool “get_treatment” rewrote its description, which is the text the model reads security
- Schema quality: 375 → 436 ▼ functional
- Schema quality: unverified → excellent ▲ functional
- “check_citation” added an optional parameter “proposition” cosmetic
- “get_propositions” added an optional parameter “proposition” cosmetic
- “get_treatment” added an optional parameter “proposition” cosmetic
- 25 Sept 26 −11
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 24 Sept 26 +1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “check_brief” rewrote its description, which is the text the model reads security
- Tool “check_citation” rewrote its description, which is the text the model reads security
- Tool “find_issues” rewrote its description, which is the text the model reads security
- Tool “get_case” rewrote its description, which is the text the model reads security
- Tool “get_propositions” rewrote its description, which is the text the model reads security
- Tool “search_cases” rewrote its description, which is the text the model reads security
- Tool “search_quotes” rewrote its description, which is the text the model reads security
- Schema quality: 321 → 370 ▼ functional
- New tool “find_authority” functional
- New tool “verify_quote” functional
- “check_citation” added an optional parameter “quote” cosmetic
- “find_issues” added an optional parameter “detail” cosmetic
- “get_case” added an optional parameter “find_text” cosmetic
- “get_case” added an optional parameter “quotable” cosmetic
- “search_quotes” added an optional parameter “state” cosmetic
- “find_issues” reworded the description of “max_issues” cosmetic
- 23 Sept 26 0
- Tool “get_case” rewrote its description, which is the text the model reads security
- 22 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.
- 20 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 26 Sept 2026 · Probed https://mcp.syfert.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=syfert.com | CN=YE2,O=Let's Encrypt,C=US | 20 Aug 2026 | 18 Nov 2026 | ECDSA 256 | ECDSA-SHA384 | 5a6f59bdd7ed1d580693e83acd2f003bfe3 |
| SANs: *.syfert.com, syfert.com | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.syfert.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| syfert.com. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=15552000 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.syfert.com/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.syfert.com/mcp | Inconclusive | 405 |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
check_brief Audit every citation in a brief ~609
Audit ALL citations in a draft brief, motion, or memo at once (wraps syfert.com Brief Check). Extracts every reporter citation, verifies each exists, checks the case name the document claims against the real case (hallucination detection), checks each quoted passage word for word against the cited opinion's own text (misquote = not in that opinion; unquoted_by_courts = the text could not be compared and no court has quoted those words from the case: check it with verify_quote), traces an unmatched quote to the case the language actually ORIGINATES in (quote_origin: attribute with "(quoting …)" or cite the source), and returns treatment flags with replacement suggestions for red-flagged authority. Also audits every STATUTE, REGULATION and COURT-RULE citation in the document against the corpus that holds it, reported separately under "statutes" (verified=false means not found in that corpus, which is not proof the section is wrong). ALWAYS run this on a finished draft before delivering it. Use mode=attack on an OPPONENT's brief to get ammunition: distinguishing and criticizing citers for each of their cites. Text over the size cap (128KB anonymous, 512KB with a token) is cut before the audit and the response then carries stats.truncated_bytes plus an INCOMPLETE AUDIT warning. corrections lists every quote the cited opinion does not carry verbatim, with replace_with (the opinion's own words) and star_page, and every unresolved or name-mismatched citation. Each unresolved citation carries verdict (exists_unindexed = a real case our index lacks, confirmed by a citing opinion or by name -- keep it; not_indexed = unknown, weigh volume_coverage (thin 2019+ volumes make a miss weak evidence); interior_mismatch/strong = likely fabricated), so do not report every unresolved cite as a hallucination (MCP13_20260925). A pinpoint page written as a citation of its own is status pin_reference (stats.pin_references, not unresolved) and its correction gives cite_as (first page, then…
| Name | Type | Req | Description |
|---|---|---|---|
| max_cites | integer | – | Max citations to process (default 100, max 200) |
| mode | string | – | defend (default): audit your own draft. attack: treat the text as the opponent's brief and return ammunition against their cites. |
| text | string | yes | The full document text (up to 512KB) |
No output schema declared.
No examples provided.
check_citation Check a citation ~919
Verify a legal citation actually exists before using it. CASES: returns the real case at that citation, its treatment flag, and (if expected_case_name given) whether the name matches. This catches hallucinated or miscopied citations. A reporter cite that is not indexed comes back with a verdict, and the verdict is what to act on (MCP13_20260925): exists_unindexed = the case is REAL (a court in the corpus prints this exact citation, see cited_by_corpus, or the case is found by name and year, see name_candidates) and only our reporter index lacks it -- never call it a hallucination; not_indexed = no evidence either way, read volume_coverage: for 2019+ volumes of the state regional reporters we often index under 30% of the cases (coverage_pct), so a miss there is weak evidence; interior_mismatch / strong = the page provably sits inside a differently named case, or the volume is complete and nothing turns up by name -- treat as likely fabricated. Local misses are also re-checked LIVE against CourtListener. STATUTES, REGULATIONS AND COURT RULES: a citation that is not a reporter cite is checked against the corpus that holds it (50 states + DC, 44 states' court rules, the Florida Administrative Code, USC/CFR/federal rules/USSG) and comes back with type, verified, the canonical citation, title, url and link_md; verified=false carries nearby sections and a coverage note, and is NEVER proof the section does not exist. ALWAYS use this to verify any citation that will appear in a legal document. With quote, the quoted words are checked against the opinion the cite resolves to (quote_check, the verify_quote block). PROPOSITION-LEVEL TREATMENT (MCP14_20260925): pass proposition (what you cite the case for; quote is used when proposition is absent) and treatment.proposition names the one proposition citing courts cite it for that matches, with its OWN flag, and treatment.proposition_note says when that point is flagged although the case is green (or unflagged although the case i…
| Name | Type | Req | Description |
|---|---|---|---|
| citation | string | yes | The citation, e.g. "819 So. 2d 732", "Siegle v. Progressive, 819 So. 2d 732 (Fla. 2002)", "Fla. Stat. § 83.49", "Fla. R. Civ. P. 1.510", "42 U.S.C. § 1983", "N.C. R. App. P. 10" |
| expected_case_name | string | – | Case name the citation is claimed to belong to, for mismatch detection. Also lets a citation newer than the reporter index resolve by name + decision date: same-name cases in the window come back as… |
| proposition | string | – | Optional: the point you cite this case for (a sentence of your draft or a paraphrase); returns treatment.proposition and treatment.proposition_note, the treatment of that proposition |
| quote | string | – | Optional: words you quote from this case; returns quote_check (verbatim | near | absent, best_match, star_page) |
| state | string | – | Optional two-letter state code, used only for statute/rule cites: settles a form two states both recognise, and resolves forms the corpus registry cannot classify. Ignored for case citations |
No output schema declared.
No examples provided.
find_authority Find the case to cite for a proposition ~295
Find the case to cite for a proposition. Paste the proposition or the language you need authority for VERBATIM; do not convert it to keywords. The result names the source case to cite (source_case), the verbatim passage, and how many courts have adopted it (quoted_by_cases); match_kind says how it matched: exact_phrase (the passage contains your words), relaxed (it shares your distinctive words), proposition (a rule later courts cite that case for). A miss means no court has quoted or been cited for that wording; try find_issues for the doctrine, or search_cases with 3-4 distinctive words. Routing: a proposition or quoted language -> find_authority (pasted verbatim); a doctrine name or fact pattern -> find_issues; a party name, statute number or keywords -> search_cases. Quotation marks mean pasted from a tool result (opinion text, passage, best_match). If you typed a quote from memory, run verify_quote and use best_match. Run check_brief on the finished draft and apply its corrections. Copy cite_as for the citation (first page, then pin). The first 3 rows carry star_page and cite_as.
| Name | Type | Req | Description |
|---|---|---|---|
| proposition | string | yes | The proposition or quoted language, verbatim (three or more words; up to ~300 characters are used) |
| state | string | – | Optional two-letter state code: that state's propositions rank first |
No output schema declared.
No examples provided.
find_court Find a court id ~113
Resolve a court name to court_id values usable in the search_cases court filter. Also resolves whole GROUPS of courts (tribal courts, veterans, bankruptcy, all U.S. district courts) to the single aggregate token that filters on all of them: see court_groups in the result.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Court name or group, e.g. "Florida", "Eleventh Circuit", "Texas Supreme", "Navajo Nation", "tribal courts", "veterans", "bankruptcy" |
No output schema declared.
No examples provided.
find_issues Research an issue ~422
ENTRY BY ISSUE. Use this FIRST when the question arrives as facts or an issue rather than a case name ("can the appellate court affirm on a ground the trial court never reached", "impact rule emotional distress", "Fabre defendant"). Returns (1) the doctrine as courts in that STATE actually name it, with the cases on EACH side (followed_by / questioned_by, from how each citing opinion treated the case), example sentences judges wrote, the statutes those opinions construe, and every state where the phrase is alive with its year span (a doctrine retained in one state and abandoned elsewhere shows as a stalled span); and (2) the matching mined propositions (the rule text courts quote) with per-passage flags. Doctrine name is not case health: an issue can be alive while its anchor case is red. Read questioned_by before relying on followed_by. A q of more than 8 substantive words is read as a proposition: propositions (matched against all of it) come first. The default answer holds 3 issues and 5 statutes and stays under ~12,000 characters (issues_omitted counts the rest); max_issues or detail=true returns more. Routing: a proposition or quoted language -> find_authority (pasted verbatim); a doctrine name or fact pattern -> find_issues; a party name, statute number or keywords -> search_cases.
| Name | Type | Req | Description |
|---|---|---|---|
| detail | boolean | – | true = the full-size answer: 8 issues, 8 statutes each, no character budget |
| max_issues | integer | – | Default 3 (8 with detail=true), max 20 |
| q | string | yes | The issue or doctrine in 2-6 words as a lawyer would name it: "tipsy coachman", "economic loss rule", "Stand Your Ground immunity", "Richardson hearing" |
| state | string | – | Two-letter state code of the CITING courts (fl, ga, tx, ny ...). Strongly recommended: the map is keyed per state. Omit to search all states. |
No output schema declared.
No examples provided.
find_related_cases Related cases in the same doctrinal line ~165
Expand research from one good case: returns the doctrinal family it belongs to: the line of frequently co-cited cases around an anchor authority (curated set of ~1,500 major doctrinal lines; landmark cases only). Use when you have one on-point case and need the rest of the line. If the case has no family, fall back to get_citing_cases or search_cases.
| Name | Type | Req | Description |
|---|---|---|---|
| case_name | string | – | Case name; lets a citation newer than the reporter index resolve by name + date (candidates returned if several share the name) |
| citation | string | – | Reporter citation (used if cluster_id absent) |
| cluster_id | integer | – | Cluster id of the case |
| max_cases | integer | – | Default 15, max 40 |
No output schema declared.
No examples provided.
get_case Read a case ~458
Fetch one case: metadata, parallel citations, treatment flag, and full opinion text (paginated via offset/max_chars). cited_by is CourtListener's citation count; for a decision filed as several twin clusters it is summed over them (cited_by_note says so), and a duplicate or stub twin id is answered with its survivor (note says so). Citations inside the returned text are checked against the reporter index (embedded_citations); citation_warnings names any the court itself got wrong. Identify the case by cluster_id (from search_cases results) or by reporter citation. find_text returns passages: up to 5 sentence-bounded windows holding a phrase (or its closest match) with star_page and offset, so a long opinion need not be paged (pass include_text=false to get only those); quotable=true adds quotable_passages, the passages of this opinion other courts quote. Quotation marks mean pasted from a tool result (opinion text, passage, best_match). If you typed a quote from memory, run verify_quote and use best_match. Run check_brief on the finished draft and apply its corrections. Copy cite_as for the citation (first page, then pin).
| Name | Type | Req | Description |
|---|---|---|---|
| case_name | string | – | Case name; used only when the citation is not in the reporter index (newer than it): resolves by name + decision-date window and returns candidates if several cases share the name |
| citation | string | – | Reporter citation, e.g. "819 So. 2d 732" (used if cluster_id absent) |
| cluster_id | integer | – | Cluster id from search results |
| find_text | string | – | A phrase to locate in the opinion: returns passages (exact, or the closest match) with star_page and offset |
| include_text | boolean | – | Include opinion text (default true) |
| max_chars | integer | – | Max characters of opinion text to return (default 40000, max 150000) |
| offset | integer | – | Character offset for paging long opinions (use next_offset from a prior call) |
| quotable | boolean | – | With include_text, also return quotable_passages: the passages of this opinion other courts quote, with star_page |
No output schema declared.
No examples provided.
get_citing_cases Cases citing this case ~204
Full citator list: every ranked case citing this one, with judge-written parentheticals (usable verbatim in a brief), verbatim quotes, pin cites, and the citing court's own Bluebook signal. Filter by flag color. Best for FINDING SUPPORTING AUTHORITY and parentheticals; for comprehensive negative-treatment checking use get_treatment (this list covers only each case's top-ranked ~50 citers).
| Name | Type | Req | Description |
|---|---|---|---|
| case_name | string | – | Case name; lets a citation newer than the reporter index resolve by name + date (candidates returned if several share the name) |
| citation | string | – | Reporter citation (used if cluster_id absent) |
| cluster_id | integer | – | Cluster id of the case |
| flag_filter | string | – | Comma list of flag colors to include: red,yellow,green,neutral,procedural. Omit for all. |
| max_citers | integer | – | Default 25, max 100 |
No output schema declared.
No examples provided.
get_propositions What is this case cited for? ~295
What is this case actually cited FOR? Returns the distinct legal propositions courts cite the case for (headnote-grade), each with its OWN treatment flag and counts. A case can be good law on one proposition and overruled on another. Use before citing a case for a specific point, and to find the strongest proposition to cite it for. passage is the opinion's own wording of the proposition with its star_page; passage null means citing courts paraphrase it. Pass proposition (your use of the case) to get proposition_match, the one proposition it matches, and proposition_note (MCP14_20260925). Quotation marks mean pasted from a tool result (opinion text, passage, best_match). If you typed a quote from memory, run verify_quote and use best_match. Run check_brief on the finished draft and apply its corrections. Copy cite_as for the citation (first page, then pin).
| Name | Type | Req | Description |
|---|---|---|---|
| case_name | string | – | Case name; lets a citation newer than the reporter index resolve by name + date (candidates returned if several share the name) |
| citation | string | – | Reporter citation (used if cluster_id absent) |
| cluster_id | integer | – | Cluster id of the case |
| max_propositions | integer | – | Default 10, max 25 |
| proposition | string | – | Optional: the point you cite this case for; returns proposition_match + proposition_note |
No output schema declared.
No examples provided.
get_statute Read a statute or rule ~557
Fetch the full current text of a statute, rule, or code section.
| Name | Type | Req | Description |
|---|---|---|---|
| citation | string | yes | Section as commonly cited: "83.49", "16-5-1", "174.02". Multi-code states (TX/CA/NY) need the code name too: "Tex. Penal Code 22.01". |
| jurisdiction | string | yes | Which corpus: any two-letter state code (all 50 states + dc), or fl_statute (Fla. Stat.), fl_rule (FL court rules), fac (Florida Administrative Code, "6A-6.03019"), ga (O.C.G.A.), usc, cfr, fedrule,… |
| max_chars | integer | – | Max characters of body text (default 40000) |
| offset | integer | – | Character offset for paging long sections |
No output schema declared.
No examples provided.
get_treatment Is this case still good law? ~288
Is this case still good law? Returns the Syfertize treatment flag (red = overruled/superseded, yellow = questioned/distinguished, green = followed, procedural = cert/rehearing denied) plus the citing cases behind each signal with quoted context. A case can be green overall and red on the proposition you need it for (MCP14_20260925): propositions_summary lists the propositions courts cite it for (most-cited first), each with its OWN flag; pass proposition (your use of the case) and proposition_match returns the one that matches, with its negative_citers, and treatment.proposition_note states the result ("no proposition-level signal for this use" = only the case-level flag applies).
| Name | Type | Req | Description |
|---|---|---|---|
| case_name | string | – | Case name; lets a citation newer than the reporter index resolve by name + date (candidates returned if several share the name) |
| citation | string | – | Reporter citation (used if cluster_id absent) |
| cluster_id | integer | – | Cluster id of the case |
| max_citers | integer | – | Max citing-case detail rows (default 25, max 100; negative signals sort first) |
| proposition | string | – | Optional: the point you cite this case for, in your words or as quoted; returns proposition_match (that proposition's own flag and negative citers) and treatment.proposition_note |
No output schema declared.
No examples provided.
search_cases Search case law ~625
Full-text search over 10.7M U.S. court opinions (all states + federal, via syfert.com). Call this to find case law on a topic, locate a case by name, or find cases citing a statute. Routing: a proposition or quoted language -> find_authority (pasted verbatim); a doctrine name or fact pattern -> find_issues; a party name, statute number or keywords -> search_cases. Each hit carries bluebook and url (snippet up to 240 chars); a hit whose snippet quotes an earlier case carries passage_origin, the case to cite for that language. Query syntax: boolean AND/OR/NOT, "exact phrases", proximity (term1 w/5 term2), wildcards (neglig*), and field filters inside q (name:, judge:, syllabus:). Statute-style numbers like 83.49 are matched as citations to that statute. total may be null: a court or date filter makes the exact count too expensive to compute, and total_pages + total_note then carry the scale. partial: true means the time budget was hit; see partial_note. tier names the backend that served the search: pro = the dedicated index, free/anon = the cloud index behind a short queue.
| Name | Type | Req | Description |
|---|---|---|---|
| compact | boolean | – | true = shorter rows (bluebook, url, date_filed, cited_by, status if not published, treatment flag and red/yellow counts, snippet, holding, passage_origin); default false |
| court | string | – | Court id filter, comma-separable, trailing * for prefix. E.g. fla* (all Florida), scotus, ca11, fladistctapp1. Also takes a group token covering a whole set of courts: us-circuits, us-districts, us-b… |
| date_from | string | – | YYYY-MM-DD |
| date_to | string | – | YYYY-MM-DD |
| judge | string | – | Judge name filter |
| page | integer | – | Page number, default 1 |
| per_page | integer | – | Results per page, default 10, max 20 |
| q | string | yes | Search query. Examples: "premises liability" AND negligence; name:miranda; 768.28 sovereign immunity |
| sort | string | – | Default relevance (authority-weighted). |
| state | string | – | Two-letter state code (fl, tx, ny, ca ... all 50 states + dc). Scopes the search to that state's OWN courts — supreme, appellate, circuit and county. Federal district and bankruptcy courts sitting in… |
| status | string | – | published or unpublished |
No output schema declared.
No examples provided.
search_quotes Trace a quoted passage ~292
Find every case that has quoted a phrase. Phrase-matched search over 4.3M distinct passages quoted by two or more opinions, ranked by how many cases quote them. Use it to (a) find the true source of half-remembered language BEFORE attributing it, and (b) locate the canonical wording of a rule. Returns the passage, its source case, and adoption counts. When no passage has the exact phrase it falls back to passages sharing its distinctive words (match_kind relaxed), and it adds the mined propositions later courts cite a case for (match_kind proposition). Same tool as find_authority. Routing: a proposition or quoted language -> find_authority (pasted verbatim); a doctrine name or fact pattern -> find_issues; a party name, statute number or keywords -> search_cases. Quotation marks mean pasted from a tool result (opinion text, passage, best_match). If you typed a quote from memory, run verify_quote and use best_match. Run check_brief on the finished draft and apply its corrections. Copy cite_as for the citation (first page, then pin). The first 3 rows carry star_page and cite_as.
| Name | Type | Req | Description |
|---|---|---|---|
| quote | string | yes | The phrase to search for (three or more words; matched as a phrase, not keywords) |
| state | string | – | Optional two-letter state code: proposition rows from that state rank first |
No output schema declared.
No examples provided.
search_statutes Search statutes and rules ~411
Search statutes, COURT RULES and codes by citation or topic, for EVERY U.S. state plus federal. For a specific state, pass state="wi" (any two-letter code, all 50 states + DC) and a topic or section number; add kind="rule" for that state's court rules or kind="statute" for its code. Without state it searches only the kinds named in kinds (default: Florida). Handles citation lookups ("83.49", "174.02") and topic queries ("dog bite strict liability").
| Name | Type | Req | Description |
|---|---|---|---|
| kind | string | – | With state: scope to one source — "rule" (that state's court rules) or "statute" (its code). Omit to search both; the response's sources field lists what the corpus holds and how many rows of each. |
| kinds | string | – | Used only when state is absent. Comma list of corpus kinds: statute (FL statutes), rule (FL court rules), fac (Fla. Admin. Code), ocga, usc, cfr, fedrule, sg, plus any state's own kind ("nc", "tx") a… |
| limit | integer | – | Max hits (default 5, max 25) |
| q | string | yes | Citation or topic query, max 200 chars |
| state | string | – | Two-letter state code to search that state's corpus (e.g. wi, tx, ny, ca). Covers all 50 states + dc. That corpus holds the state's COURT RULES too in 44 of the 51 — all but ks, la, nh, ok, sd, vt, w… |
No output schema declared.
No examples provided.
verify_quote Verify a quotation against the opinion ~288
Check one quotation against the full text of the opinion it is attributed to, before it goes in quotation marks. Returns verdict (verbatim | near | absent), percent, best_match (the opinion's own sentence, up to ~600 characters), star_page (the last *page marker before it, null when the text carries none), offset (get_case offset), case and advice. near means the opinion says it in other words: paste best_match instead. absent means the words are not in this opinion. Identify the case by cluster_id or reporter citation (case_name helps a citation newer than the reporter index). Quotation marks mean pasted from a tool result (opinion text, passage, best_match). If you typed a quote from memory, run verify_quote and use best_match. Run check_brief on the finished draft and apply its corrections. Copy cite_as for the citation (first page, then pin).
| Name | Type | Req | Description |
|---|---|---|---|
| case_name | string | – | Case name; lets a citation newer than the reporter index resolve by name + date |
| citation | string | – | Reporter citation of that case, e.g. "376 So. 2d 230" (used if cluster_id absent) |
| cluster_id | integer | – | Cluster id of the case the quote is attributed to |
| quote | string | yes | The quoted words exactly as you intend to use them (three or more words) |
No output schema declared.
No examples provided.
What is the Syfert Legal Research MCP server?
Syfert Legal Research is an MCP server listed in the public MCP registry as com.syfert/legal-research. Verify legal citations, case treatment, quotes and whole briefs against 10.7M U.S. opinions. This page covers its hosted endpoint (https://mcp.syfert.com/mcp).
Is the Syfert Legal Research MCP server safe to use?
Syfert Legal Research scores 74 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Syfert Legal Research MCP server expose?
Syfert Legal Research exposes 15 tools: search_cases, get_case, check_citation, verify_quote, get_treatment, and 10 more. Their descriptions and schemas cost roughly 5,941 tokens of context every time the server is loaded.
Does the Syfert Legal Research MCP server require authentication?
No. We connected to Syfert Legal Research without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the Syfert Legal Research MCP server still maintained?
Syfert Legal Research is still listed as active in the MCP registry. We last reached this channel on 26 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.