A side-by-side look at the AI Rechtshulp and Justicelibre MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose AI Rechtshulp for legal work over a hosted endpoint; choose Justicelibre for legal over a hosted endpoint. You can also run both side by side in one mcpServers block.
search, check_source, save_source.search_doctrine, get_law_article, search_decisions_citing.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Legal | Legal |
| Quality signal | 53/100 · Good | 59/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Remote HTTP/SSE | Remote HTTP/SSE |
| Auth | OAuth 2.0 | Not declared |
| Pricing | Freemium | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 0 | 12 |
| Directory activity | 0 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 6 | 19 |
| Full listing | View AI Rechtshulp | View Justicelibre |
searchSearch case law; fetch a judgment by ECLI.check_sourceVerify that a quote appears in a judgment.save_sourceSave sources and write a research memo.scan_contractResearch a supplied text such as a contract or an argument against sources (account, with consent).list_dossiersDossiers in your account (paid).accountPlan and source budget.search_doctrineOpinions of the CADA (access to administrative documents), decisions of the Défenseur des droits, conclusions of the CE's rapporteurs publics, BOFiP (tax guidance), Code du travail numérique, CNIL deliberations. These are NOT court decisions: an opinion does not bind the judge. Keywords in French. Read a document: get_decision(id=…). For conclusions (ariane_crp), the case number is `numero`; `doc_id` is an internal identifier.
Example: search_doctrine(query="communication dossier médical", source="cada")get_law_articleArticle of a French code or statute, as in force on a date (default: today). `code` accepts an abbreviation ("CT", "cc"), a name ("code du travail"), a LEGITEXT or a statute ("loi 91-647", "loi du 1er juillet 1901"); list: about(topic="codes"). To cite an older decision, pass its date: the article is served as it stood then. `view="versions"` gives its history, `view="map"` its successive wordings, the texts that cite it and the implementing orders. `etat` and `note` flag when the database may lag behind Légifrance. `info_numero` flags that a text may have been renumbered (former art. 1382 of the Code civil is art. 1240 since 2016; the current 1382 is a different text). `num` also accepts a LEGIARTI (then `code` may be omitted). Without `num`, code="LEGITEXT…" (outside the codes) returns the whole text, 120 articles per page (`suite`: offset=…).
Examples: get_law_article(code="CT", num="L1152-1"); get_law_article(code="code civil", num="1382", date="2015-06-01")search_decisions_citingCourt decisions that EXPLICITLY cite an article ("article 1240 du code civil", "art. L. 1152-1 du code du travail"). Does not find indirect references or citations without an article number: searching by concept is for `search`.
Example: search_decisions_citing(code="CC", num="1240")searchSearches all sources (French and European case law, codes and
statutes, Journal officiel, collective agreements, doctrine), expanding to
legal synonyms. Entry point for an open question; for one specific court,
use `search_case_law`. A citation ("Cass. soc. 11 mai 2022", an ECLI, an
appeal number) is recognised and searched as such. Singular and plural are
searched together; "in double quotes": the exact word. Query in French:
the data is French (some ECHR/CJEU texts are English only).
Example: search(query="harcèlement moral fonctionnaire")
Args:
query: keywords or a citation; OR/AND/NOT/NEAR in UPPERCASE between two
words are operators (NEAR = within 10 words); lowercase words are plain words
sources: dila, jade, legi, cedh, cjue, kali, jorf, doctrine (empty: all)
sort: relevance | date_desc | date_asc
date_min: YYYY-MM-DD (all sources)
date_max: YYYY-MM-DD
limit: results (max 100)
expand_synonyms: expand to legal synonyms (default true)search_case_lawDecisions of one court or court family, by relevance or by date (latest
decisions: `search_recent_admin_decisions`). Keywords in French.
ECHR, CJEU: texts sometimes in English only.
Example: search_case_law(query="licenciement inaptitude", court="CASS")
Args:
query: keywords (optional with numero_rg), plural included except "in double quotes";
OR/AND/NOT/NEAR in UPPERCASE between two words are operators (NEAR = within
10 words); lowercase words are plain words
court: ADMIN (CE+CAA+TA) | CE | CAA | TA | ARIANEWEB | JUDICIAIRE | CASS | CA | TJ | TCOM | CONSTIT | CEDH | CJUE
court_name: "TA Lille", "CAA Douai" (ADMIN, CE, CAA, TA)
sort: relevance | date_desc | date_asc (ADMIN, CE, CAA, TA)
date_min: YYYY-MM-DD (not ARIANEWEB, CEDH, CJUE)
date_max: same
numero_rg: RG number (CA, JUDICIAIRE)
nature: QPC, DC… (CONSTIT)
limit: results per page (max 50)
offset: pagination (pass next_offset as is)search_recent_admin_decisionsLatest decisions from the administrative courts' open data (daily mirror),
sorted by date: what a court has just decided (by relevance: `search_case_law`).
All words required (singular or plural); "in double quotes": exact form;
OR/AND/NOT/NEAR in UPPERCASE between two words are operators (NEAR = within
10 words); lowercase words are plain words. Keywords in French: judgments
spell out the full expression, rarely the acronym ("OQTF").
Example: search_recent_admin_decisions(query='"obligation de quitter le territoire"', court="TA59")
Args:
query: keywords; empty = all decisions of the court
court: CE | CE-CAA (CE + CAA) | code of a TA or CAA ("TA59",
"CAA69") | ALL_TA (the 40 TA) | ALL_CAA (the 9 CAA)
limit: results (one court; max 100)
limit_per_court: results per court (ALL_TA, ALL_CAA; max 100)
total_limit: overall cap (ALL_TA, ALL_CAA; 0 = no cap)
date_min, date_max: YYYY-MM-DD, date of the decision (optional)get_decisionFull text of a decision, by `id` or by `numero` (+ `court`).
Several decisions with that number: list `decisions` (ECHR/CJEU: the one
judgment is served, the rest in `autres_documents`).
An administrative number alone ("2200433") is refused; CE: see `homonymes`.
Also reads doctrine (cada:…, ddd:…), JORFTEXT and KALIARTI ids.
Examples:
get_decision(id="CETATEXT000007641393")
get_decision(numero="497566", court="CE")
get_decision(numero="23/05688", court_name="CA Douai") # RG
get_decision(numero="24-14.641") # Cour de cassation appeal; likewise
2024L02643 (commercial court), 6538/74 (ECHR), C-72/24 (CJEU)
Args:
id: id from a search (JURITEXT, CETATEXT, 001-…, CELEX, JORFTEXT…)
or a judicial/European case number
numero: case, appeal (pourvoi), RG, commercial court, ECHR or CJEU number
court: CE | CAA | TA | CONSTIT | CASS | CA | TJ | TCOM | CPH | CEDH | CJUE
court_name: "TA Lyon", "CA Douai"
nature: DC, QPC… (CONSTIT, shared number)search_legislationKeyword search in French codes and statutes (LEGI), the Journal officiel
(JORF) or collective agreements (KALI). Known article: `get_law_article`.
Keywords in French.
Example: search_legislation(query="harcèlement moral", code="CT")
Agreement (corpus="kali"): idcc="1486" without query → table of contents;
query="Syntec" → agreements, texts; KALI id → sections or text.
Args:
query: keywords (all required; "in double quotes": exact form), or a KALI id;
optional for kali with idcc; OR/AND/NOT/NEAR in UPPERCASE between two words
are operators (NEAR = within 10 words); lowercase words are plain words
corpus: legi | jorf | kali
code: legi: code abbreviation or name ("CT", "code du travail")
nature: jorf: LOI, DECRET, ARRETE…
idcc: kali: IDCC number
date_min: YYYY-MM-DD (legi, jorf)
date_max: YYYY-MM-DD (legi, jorf)
limit: results per page (max 50)
offset: pagination offset
tout: kali: include repealed textsresolve_referenceTurns a reference into an identifier and an official link:
statute or decree number ("91-647", "loi n° 78-17") → the text;
identifier (LEGIARTI, LEGITEXT, JORFTEXT, CETATEXT, JURITEXT, ECLI,
CELEX, HUDOC) → URL at the source. A decision number is read with
get_decision instead (the error gives the exact call).
Examples:
resolve_reference(reference="loi n° 91-647")
resolve_reference(reference="LEGIARTI000032041571")
Args:
reference: text number or identifier
legitext: parent LEGITEXT (for a LEGIARTI of a text outside the codes)
date: YYYY-MM-DD (article version in the URL)get_legislative_historyLegislative history (travaux préparatoires) of a French statute: the
Assemblée nationale and Sénat files, with stages, texts and reports.
Example: get_legislative_history(loi="2016-1547")
Args:
query: keywords from the file title (French); OR/AND/NOT in UPPERCASE between
two words are operators; lowercase words are plain words
loi: statute number ("2016-1547")
limit: number of files (max 20)
steps: include the stages of the shuttle between the two chamberssearch_directoryPublic addresses and contacts in France: courts, court registries
(greffes), town halls, CCAS, prefectures, public services.
Example: search_directory(query="tribunal judiciaire Dunkerque")
Args:
query: name, town or type of office (French); OR/AND/NOT in UPPERCASE between
two words are operators ("Lille OR Douai"); lowercase words are plain words
category: directory category (optional)
source: directory source (optional)
limit: number of results (max 200)aboutWhat JusticeLibre covers (sources, volumes, freshness, terms of use),
the list of administrative courts and their codes, or the list of codes
and statutes accepted by get_law_article.
Example: about(topic="codes")
Args:
topic: service | courts | codesPaste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"ai-rechtshulp": {
"url": "https://app.ai-rechtshulp.nl/mcp"
}
}
}
{
"mcpServers": {
"justicelibre": {
"url": "https://justicelibre.org/mcp"
}
}
}