# Syfert Legal Research (remote · mcp.syfert.com)

Verify legal citations, case treatment, quotes and whole briefs against 10.7M U.S. opinions

- Trust score: 74/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-26

## Components

- remote · `mcp.syfert.com`: 74/100 (this document), [markdown](https://verifymcp.io/servers/com-syfert-legal-research/mcp.md), [page](https://verifymcp.io/servers/com-syfert-legal-research/mcp)

## Channel facts

- Endpoint: `https://mcp.syfert.com/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.1.0`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-26.

- **Endpoint Security**: 69/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS enforcement could not be verified: the plaintext port answered with HTTP 405, which proves neither a plaintext path nor enforcement.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 62/100
  - AI-judged instruction clarity (excellent).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 53/100
  - Stability observed for 16 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 16 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

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

### Claude

```bash
claude mcp add --transport http com-syfert-legal-research 'https://mcp.syfert.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-syfert-legal-research": {
      "url": "https://mcp.syfert.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-syfert-legal-research": {
      "type": "http",
      "url": "https://mcp.syfert.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-syfert-legal-research]
url = "https://mcp.syfert.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-syfert-legal-research": {
      "type": "remote",
      "url": "https://mcp.syfert.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-syfert-legal-research --url 'https://mcp.syfert.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-syfert-legal-research:
    url: "https://mcp.syfert.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-syfert-legal-research": {
      "Transport": "http",
      "Url": "https://mcp.syfert.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-syfert-legal-research -t streamable-http -u 'https://mcp.syfert.com/mcp'
```

### Other

```json
{
  "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.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-26 (score 74, +11)

- [security improvement] 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
- [functional regression] Schema quality: 375 → 436
- [functional improvement] Schema quality: unverified → excellent
- [cosmetic] “check_citation” added an optional parameter “proposition”
- [cosmetic] “get_propositions” added an optional parameter “proposition”
- [cosmetic] “get_treatment” added an optional parameter “proposition”

### 2026-09-25 (score 63, −11)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-24 (score 74, +1)

- [security] 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
- [functional regression] Schema quality: 321 → 370
- [functional] New tool “find_authority”
- [functional] New tool “verify_quote”
- [cosmetic] “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”

### 2026-09-23 (score 73, 0)

- [security] Tool “get_case” rewrote its description, which is the text the model reads

### 2026-09-22 (score 73, +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.

### 2026-09-20 (score 72, +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.

### 2026-09-18 (score 71, +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.

### 2026-09-15 (score 70, +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.

## MCP tools (15)

### `search_cases` (~625 tokens)

Search case law

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.

Input parameters:

- `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, required): 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

### `get_case` (~458 tokens)

Read a case

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

Input parameters:

- `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

### `check_citation` (~919 tokens)

Check a citation

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…

Input parameters:

- `citation` (string, required): 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

### `verify_quote` (~288 tokens)

Verify a quotation against the opinion

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

Input parameters:

- `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, required): The quoted words exactly as you intend to use them (three or more words)

### `get_treatment` (~288 tokens)

Is this case still good law?

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

Input parameters:

- `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

### `check_brief` (~609 tokens)

Audit every citation in a brief

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…

Input parameters:

- `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, required): The full document text (up to 512KB)

### `get_propositions` (~295 tokens)

What is this case cited for?

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

Input parameters:

- `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

### `get_citing_cases` (~204 tokens)

Cases citing this case

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

Input parameters:

- `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

### `find_related_cases` (~165 tokens)

Related cases in the same doctrinal line

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.

Input parameters:

- `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

### `find_court` (~113 tokens)

Find a court id

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.

Input parameters:

- `name` (string, required): Court name or group, e.g. "Florida", "Eleventh Circuit", "Texas Supreme", "Navajo Nation", "tribal courts", "veterans", "bankruptcy"

### `search_quotes` (~292 tokens)

Trace a quoted passage

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.

Input parameters:

- `quote` (string, required): 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

### `find_authority` (~295 tokens)

Find the case to cite for a proposition

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.

Input parameters:

- `proposition` (string, required): 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

### `find_issues` (~422 tokens)

Research an issue

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.

Input parameters:

- `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, required): 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.

### `search_statutes` (~411 tokens)

Search statutes and rules

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

Input parameters:

- `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, required): 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…

### `get_statute` (~557 tokens)

Read a statute or rule

Fetch the full current text of a statute, rule, or code section.

Input parameters:

- `citation` (string, required): 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, required): 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

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-syfert-legal-research/mcp#diagnostics

## Score history

- 2026-09-26: 74
- 2026-09-25: 63
- 2026-09-24: 74
- 2026-09-23: 73
- 2026-09-22: 73
- 2026-09-21: 72
- 2026-09-20: 72
- 2026-09-19: 71
- 2026-09-18: 71
- 2026-09-17: 70
- 2026-09-16: 70
- 2026-09-15: 70
- 2026-09-14: 69
- 2026-09-13: 69
- 2026-09-12: 68
- 2026-09-11: 68
- 2026-09-10: 67

## Common questions

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

## Links

- Remote endpoint: https://mcp.syfert.com/mcp
- Authorisation metadata: https://mcp.syfert.com/.well-known/oauth-protected-resource/mcp
- Website: https://syfert.com/mcp/
- Changelog RSS feed: https://verifymcp.io/servers/com-syfert-legal-research/mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-syfert-legal-research/mcp.json
- HTML version of this page: https://verifymcp.io/servers/com-syfert-legal-research/mcp
