Koskamo

lahend-mcp

An MCP server providing full-text search of Estonian court decisions, legislation, and EU law. It links rulings to companies via the Estonian Business Register and allows agents to search case law, retrieve specific legal sections, and find rulings citing specific statutes.

Endpoint and access

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

lahend-mcp logo, by NimistuCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by Nimistu
MCP endpoint (Streamable HTTP)
https://lahend.ee/api/lahend-mcp/mcp
Vendor documentation

What its tools do

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

20 of 20 have a description · 20 of 20 declare behavior hints · 12 of 18 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Full-text search of Estonian court rulings with filters for court, case type, and date range
  • Retrieve all court decisions naming a specific company using its registry code
  • Find court decisions that cite a specific paragraph of an Estonian legal act
  • Search for Estonian legal acts by title or abbreviation

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
lahend 0.1.0
MCP protocol negotiated in check
2025-11-25
Tools
20 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

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

lahend.ee is a free, ad-free search engine for Estonian court decisions (kohtulahendid), indexing the full published civil, administrative and criminal case law from Riigi Teataja. Every ruling is full-text searchable and linked to the companies named in it (via the Estonian Business Register / nimistu.ee). Use this server to: search case law by legal terms, a case number or a party name (inflection-tolerant; "quote" a phrase for an exact match); read a decision's full text; list every ruling involving a given company by its 8-digit registry code (registrikood) — a company↔case-law join unique to lahend.ee; and browse the courts and areas of law. Workflow: call `search` (or `search_rulings` for court/type/category/date filters) to find rulings, then `fetch` or `get_ruling` by the returned id for the full text. Use `rulings_by_company` to pull all case law for a company, and `list_courts` / `list_categories` to discover filter values. Data is Riigi Teataja open data reused under the Riigi Teataja Act; natural persons are anonymised by the courts.

Tools

20 advertised

search — Search Estonian court decisions
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full-text search across Estonian LAW - both court decisions (civil, administrative and criminal rulings) and legislation (acts and their individual paragraphs), from Riigi Teataja, indexed by lahend.ee. Inflection-tolerant; wrap a phrase in "quotes" for an exact match. Every result carries a stable typed `id` - `ruling:<n>`, `law:<n>` or `section:<n>:<par>` - which `fetch` resolves. Use this when you need the legal position on something and do not yet know whether the answer is in a statute or in case law.

search input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "Max results (default 10)."
    },
    "query": {
      "type": "string",
      "description": "Legal terms, a case number, a party/company name, or a \"quoted phrase\"."
    }
  },
  "additionalProperties": false
}
search output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "total",
    "results"
  ],
  "properties": {
    "total": {
      "type": "number",
      "description": "Total matching rulings."
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
fetch — Fetch a court decision by id
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve the full text + metadata for any `id` returned by `search`. Handles all three kinds: `ruling:<n>` (a court decision with its linked companies), `law:<n>` (an act in its current redaktsioon, all paragraphs) and `section:<n>:<par>` (a single paragraph - prefer this over pulling a whole act). Returns Markdown plus the canonical lahend.ee URL.

fetch input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Typed id from `search`: 'ruling:1279503', 'law:12345' or 'section:12345:199'."
    }
  },
  "additionalProperties": false
}
fetch output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id",
    "title",
    "text",
    "url",
    "metadata"
  ],
  "properties": {
    "id": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "text": {
      "type": "string",
      "description": "The full decision rendered as Markdown."
    },
    "title": {
      "type": "string"
    },
    "metadata": {
      "type": "object",
      "additionalProperties": {}
    }
  },
  "additionalProperties": false
}
fetch annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_law_section — Get one paragraph of an Estonian act
Advertised by the server during the last successful anonymous check.
Advertised read-only

Return a single § of an Estonian act, addressed the way lawyers cite it: an abbreviation and a number, e.g. abbrev='KarS', paragrahv='199', or abbrev='TsMS', paragrahv='430'. This is the precise way to answer a legal question - pulling a whole act costs thousands of tokens and buries the answer. Text comes from the act's current redaktsioon.

get_law_section input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "abbrev",
    "paragrahv"
  ],
  "properties": {
    "abbrev": {
      "type": "string",
      "description": "Act abbreviation as cited: KarS, TsMS, VÕS, PankrS, RahaPTS…"
    },
    "paragrahv": {
      "type": "string",
      "description": "Paragraph number, e.g. '199'. Superscript sections are addressed as '43-1' or '43¹' (§ 43¹) - these are DIFFERENT provisions from § 43. A full citation like '§ 430 lg 1' is also accepted; the lõige is ignored. A bare second number ('43 1') is rejected as ambiguous rather than silently read as § 43."
    }
  },
  "additionalProperties": false
}
get_law_section output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "found"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "text": {
      "type": "string"
    },
    "found": {
      "type": "boolean"
    },
    "title": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_law_section annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_law_sections — Search the text of Estonian legislation, paragraph by paragraph
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full-text search across the paragraphs of every in-force Estonian act (4M+ sections). Answers 'which provision governs X' directly, returning the paragraphs themselves rather than acts you then have to read. Each hit carries a `section:` id for `fetch`.

search_law_sections input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "Max results (default 8)."
    },
    "query": {
      "type": "string",
      "description": "A legal term or phrase, e.g. 'pankrotiavaldus', 'ehitusluba', 'töölepingu ülesütlemine'."
    }
  },
  "additionalProperties": false
}
search_law_sections output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "results"
  ],
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "title",
          "url",
          "excerpt"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "excerpt": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
search_law_sections annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_laws — Find Estonian acts
Advertised by the server during the last successful anonymous check.
Advertised read-only

Find Estonian acts by title or abbreviation (KarS, TsMS, VÕS…). Returns each act with a `law:` id for `fetch`, its type, issuer and whether it is still in force. Use get_law_section when you already know the paragraph you want.

search_laws input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "Max results (default 10)."
    },
    "query": {
      "type": "string",
      "description": "Title fragment or abbreviation."
    },
    "inForceOnly": {
      "type": "boolean",
      "description": "Only acts currently in force (default true)."
    }
  },
  "additionalProperties": false
}
search_laws output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "total",
    "results"
  ],
  "properties": {
    "total": {
      "type": "number"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "title",
          "lyhend",
          "aktLiik",
          "isInForce",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "lyhend": {
            "type": [
              "string",
              "null"
            ]
          },
          "aktLiik": {
            "type": [
              "string",
              "null"
            ]
          },
          "isInForce": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
search_laws annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
law_versions — List the redaktsioonid of an act
Advertised by the server during the last successful anonymous check.
Advertised read-only

List an act's redaktsioonid (consolidated versions) with their validity ranges, newest first. Use this to answer 'what did this say on date X' - Estonian law is amended constantly and the current text is often not the one that applied to the facts.

law_versions input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "abbrev"
  ],
  "properties": {
    "abbrev": {
      "type": "string",
      "description": "Act abbreviation, e.g. 'TsMS'."
    }
  },
  "additionalProperties": false
}
law_versions output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "act",
    "url",
    "versions"
  ],
  "properties": {
    "act": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "versions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "validFrom",
          "validTo"
        ],
        "properties": {
          "validTo": {
            "type": [
              "string",
              "null"
            ]
          },
          "validFrom": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
law_versions annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
rulings_citing_section — Find the case law applying a given paragraph
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given an act abbreviation and a §, return the court decisions that actually cite it, newest first, with a total count. Built from 3.05M citations extracted from the decision texts themselves. This answers 'how have the courts applied KarS § 199' - the question statute text alone cannot answer, and the reason to use lahend.ee over reading Riigi Teataja.

rulings_citing_section input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "abbrev",
    "paragrahv"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "Max rulings returned (default 10)."
    },
    "abbrev": {
      "type": "string",
      "description": "Act abbreviation as cited: KarS, TsMS, VÕS, PankrS…"
    },
    "paragrahv": {
      "type": "string",
      "description": "Paragraph number, e.g. '199'. A full citation is accepted; the lõige is ignored."
    }
  },
  "additionalProperties": false
}
rulings_citing_section output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "section",
    "totalRulings",
    "rulings"
  ],
  "properties": {
    "rulings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "caseNo",
          "kohus",
          "pubDate",
          "kategooria",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "kohus": {
            "type": [
              "string",
              "null"
            ]
          },
          "caseNo": {
            "type": [
              "string",
              "null"
            ]
          },
          "pubDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "kategooria": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "section": {
      "type": "string"
    },
    "totalRulings": {
      "type": "number",
      "description": "How many distinct rulings cite this §."
    }
  },
  "additionalProperties": false
}
rulings_citing_section annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
sections_cited_by_ruling — List the provisions a decision relies on
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given a ruling id (from `search`), list the statute paragraphs it cites, with the lõiked named and each § resolved to its act. Use it to see the legal basis of a decision without reading the whole judgment, then `fetch` a `section:` id for the provision text.

sections_cited_by_ruling input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Ruling id, e.g. 'ruling:1279503'."
    }
  },
  "additionalProperties": false
}
sections_cited_by_ruling output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "sections"
  ],
  "properties": {
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "act",
          "paragrahv",
          "title",
          "lgs"
        ],
        "properties": {
          "id": {
            "type": [
              "string",
              "null"
            ]
          },
          "act": {
            "type": "string"
          },
          "lgs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "paragrahv": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
sections_cited_by_ruling annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
most_cited_sections — The most-litigated provisions in Estonian law
Advertised by the server during the last successful anonymous check.
Advertised read-only

The statute paragraphs cited by the most court decisions, ranked. A map of where Estonian litigation actually happens, and a good starting point when exploring an unfamiliar area.

most_cited_sections input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1,
      "description": "How many (default 20)."
    }
  },
  "additionalProperties": false
}
most_cited_sections output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "sections"
  ],
  "properties": {
    "sections": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "act",
          "paragrahv",
          "title",
          "rulings"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "act": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "rulings": {
            "type": "number"
          },
          "paragrahv": {
            "type": "string"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
most_cited_sections annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
authority_documents_for_ruling — Public-authority documents about the companies in a ruling
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given a ruling id, return documents from Estonian public-authority document registers that name the same companies - procurement files, licences, correspondence, inspections. A court dispute and an authority's file about the same company are the two halves nobody normally sees together. Sourced from dokumendiregister.ee. This depends on the ruling having a company linked to it, which holds for about 19% of the corpus: parties are extracted from the decision text by registry code, and a judgment that names a company without its code yields no link. An empty list therefore means either no linked company or no matching documents - it is not evidence that no authority holds a file.

authority_documents_for_ruling input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Ruling id, e.g. 'ruling:1279503'."
    },
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1,
      "description": "Max documents (default 8)."
    }
  },
  "additionalProperties": false
}
authority_documents_for_ruling output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "documents"
  ],
  "properties": {
    "documents": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "title",
          "authority",
          "docType",
          "regDate",
          "company",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "company": {
            "type": [
              "string",
              "null"
            ]
          },
          "docType": {
            "type": [
              "string",
              "null"
            ]
          },
          "regDate": {
            "type": [
              "string",
              "null"
            ]
          },
          "authority": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
authority_documents_for_ruling annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_rulings — Search court decisions with filters
Advertised by the server during the last successful anonymous check.
Advertised read-only

Full-text ruling search with optional filters: court name, case type (civil/administrative/criminal), area of law (asja_kategooria) and a decision-date range. Returns a page of rulings with a total count. Use `list_courts` / `list_categories` to discover valid filter values. Two coverage limits worth knowing, because both are silent: - `companies` is populated on about 19% of rulings. Parties are extracted from the decision text by registry code, and many judgments name a company without ever stating its code. An EMPTY array means no code was found in the text, NOT that no company was involved. - About 26% of rulings carry no `asja_kategooria` at all, so filtering by `category` silently excludes them. Omit the filter to search the whole corpus.

search_rulings input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "court": {
      "type": "string",
      "description": "Exact court name, e.g. 'Harju Maakohus Tallinna kohtumaja'."
    },
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "description": "Free text (or \"quoted phrase\"); omit to browse by filters alone."
    },
    "offset": {
      "type": "integer",
      "minimum": 0
    },
    "date_to": {
      "type": "string",
      "description": "YYYY-MM-DD upper bound (decision date)."
    },
    "category": {
      "type": "string",
      "description": "Exact area of law, e.g. 'Võlaõigus'."
    },
    "case_type": {
      "enum": [
        "civil",
        "administrative",
        "criminal"
      ],
      "type": "string"
    },
    "date_from": {
      "type": "string",
      "description": "YYYY-MM-DD lower bound (decision date)."
    }
  },
  "additionalProperties": false
}
search_rulings output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "total",
    "rulings"
  ],
  "properties": {
    "total": {
      "type": "number"
    },
    "rulings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "caseNo",
          "court",
          "category",
          "date",
          "companies",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "court": {
            "type": "string"
          },
          "caseNo": {
            "type": "string"
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "companies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
search_rulings annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
rulings_by_company — Court decisions involving a company
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given an 8-digit Estonian registry code (registrikood), return every court decision that names that company, with its role (claimant/defendant/etc.) and the other parties. This company↔case-law join is unique to lahend.ee. Find a registry code via nimistu.ee or the nimistu MCP.

rulings_by_company input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "reg_code"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1
    },
    "reg_code": {
      "type": "string",
      "description": "8-digit Estonian company registry code, e.g. '16887028'."
    }
  },
  "additionalProperties": false
}
rulings_by_company output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "company",
    "count",
    "rulings"
  ],
  "properties": {
    "count": {
      "type": "number"
    },
    "company": {
      "anyOf": [
        {
          "type": "object",
          "required": [
            "regCode",
            "name"
          ],
          "properties": {
            "name": {
              "type": "string"
            },
            "regCode": {
              "type": "string"
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ]
    },
    "rulings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "caseNo",
          "court",
          "category",
          "date",
          "role",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "role": {
            "type": [
              "string",
              "null"
            ]
          },
          "court": {
            "type": "string"
          },
          "caseNo": {
            "type": "string"
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
rulings_by_company annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
list_courts — List Estonian courts
Advertised by the server during the last successful anonymous check.
Advertised read-only

All Estonian courts that have published decisions, each with its ruling count. Use a court name as the `court` filter in `search_rulings`.

list_courts input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
list_courts output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "courts"
  ],
  "properties": {
    "courts": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "count"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "count": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
list_courts annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
list_categories — List areas of law
Advertised by the server during the last successful anonymous check.
Advertised read-only

All areas of law (asja_kategooria) present in the corpus, each with its ruling count. Use a category as the `category` filter in `search_rulings`. These counts do NOT sum to the corpus size: about 26% of rulings carry no category, so they appear in `list_courts` totals and in unfiltered search but in no category here. Filtering by category silently excludes them.

list_categories input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
list_categories output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "categories",
    "uncategorised",
    "corpusTotal"
  ],
  "properties": {
    "categories": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "count"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "count": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "corpusTotal": {
      "type": "number"
    },
    "uncategorised": {
      "type": "number",
      "description": "Rulings with no asja_kategooria - not reachable via the `category` filter."
    }
  },
  "additionalProperties": false
}
list_categories annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
recent_rulings — Most recent court decisions
Advertised by the server during the last successful anonymous check.
Advertised read-only

The newest published rulings (by decision date), across all courts and areas of law.

recent_rulings input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 25,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
recent_rulings output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "rulings"
  ],
  "properties": {
    "rulings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "caseNo",
          "court",
          "category",
          "date",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "court": {
            "type": "string"
          },
          "caseNo": {
            "type": "string"
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
recent_rulings annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
eu_law_search — Search EU law in Estonian
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search EU regulations and directives, and Court of Justice / European Court of Human Rights judgments, by Estonian title or case number. The corpus is Estonian-language throughout: 94% of the Court of Justice's output is translated into Estonian, and essentially nothing indexes it in Estonian. Returns ids usable with eu_law_fetch.

eu_law_search input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 30,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "description": "Estonian title words, or a case number such as 'C-362/14'."
    }
  },
  "additionalProperties": false
}
eu_law_search output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "results"
  ],
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "kind",
          "title",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
eu_law_search annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
eu_act — Read an EU act in Estonian
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch an EU regulation or directive by CELEX (e.g. '32016R0679' for the GDPR), article by article, in Estonian. Also reports how many Estonian court decisions cite it and which articles they lean on - the part EUR-Lex cannot answer.

eu_act input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "celex"
  ],
  "properties": {
    "celex": {
      "type": "string",
      "description": "CELEX number, e.g. '32016R0679'. Sector 3 acts only."
    },
    "article": {
      "type": "string",
      "description": "Return only this article, e.g. '5'."
    }
  },
  "additionalProperties": false
}
eu_act output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "celex",
    "title",
    "url",
    "articleCount",
    "citingRulings",
    "articles",
    "mostCitedArticles"
  ],
  "properties": {
    "url": {
      "type": "string"
    },
    "celex": {
      "type": "string"
    },
    "title": {
      "type": [
        "string",
        "null"
      ]
    },
    "articles": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "article",
          "title",
          "text"
        ],
        "properties": {
          "text": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "article": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "articleCount": {
      "type": "number"
    },
    "citingRulings": {
      "type": "number"
    },
    "mostCitedArticles": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "article",
          "rulings"
        ],
        "properties": {
          "article": {
            "type": "string"
          },
          "rulings": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
eu_act annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
estonian_rulings_citing_eu_law — Find Estonian case law applying an EU instrument
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given a CELEX (an act like '32016R0679', or a Court of Justice judgment like '62014CJ0362'), return the Estonian court decisions that cite it. This is the join no other source publishes: EUR-Lex knows the EU instrument, Riigi Teataja knows the Estonian decision, and nobody connects them.

estonian_rulings_citing_eu_law input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "celex"
  ],
  "properties": {
    "celex": {
      "type": "string",
      "description": "CELEX of an EU act or judgment."
    },
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1
    },
    "article": {
      "type": "string",
      "description": "Only decisions citing this article of the act."
    }
  },
  "additionalProperties": false
}
estonian_rulings_citing_eu_law output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "celex",
    "totalRulings",
    "rulings"
  ],
  "properties": {
    "celex": {
      "type": "string"
    },
    "rulings": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "id",
          "caseNo",
          "kohus",
          "date",
          "article",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "kohus": {
            "type": [
              "string",
              "null"
            ]
          },
          "caseNo": {
            "type": [
              "string",
              "null"
            ]
          },
          "article": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "totalRulings": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
estonian_rulings_citing_eu_law annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
eu_law_cited_by_ruling — List the EU law a decision relies on
Advertised by the server during the last successful anonymous check.
Advertised read-only

Given an Estonian ruling id (from `search`), list the EU instruments it cites - regulations, directives and Court of Justice judgments - with the articles named where the decision names them.

eu_law_cited_by_ruling input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Ruling id, e.g. 'ruling:1279503'."
    }
  },
  "additionalProperties": false
}
eu_law_cited_by_ruling output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "cited"
  ],
  "properties": {
    "cited": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "celex",
          "kind",
          "label",
          "title",
          "articles",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "celex": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "articles": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
eu_law_cited_by_ruling annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
most_cited_eu_law — The EU instruments Estonian courts apply most
Advertised by the server during the last successful anonymous check.
Advertised read-only

Ranked by how many Estonian decisions cite them. A good starting point for 'which EU law actually matters in Estonian practice' - the answer is concentrated in consumer protection, jurisdiction, asylum and agriculture rather than spread evenly.

most_cited_eu_law input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "limit": {
      "type": "integer",
      "maximum": 50,
      "minimum": 1
    }
  },
  "additionalProperties": false
}
most_cited_eu_law output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "instruments"
  ],
  "properties": {
    "instruments": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "celex",
          "kind",
          "label",
          "title",
          "rulings",
          "url"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "celex": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "title": {
            "type": [
              "string",
              "null"
            ]
          },
          "rulings": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    }
  },
  "additionalProperties": false
}
most_cited_eu_law annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

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

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

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

30-day availability

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

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

Maintenance history

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

  • · probe · passed · 771 ms · metadata changed · 20 tool(s)

Connect from your client

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

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

Claude Code

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

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add lahend-mcp --url https://lahend.ee/api/lahend-mcp/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable lahend-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "lahend-mcp": {
      "url": "https://lahend.ee/api/lahend-mcp/mcp"
    }
  }
}

Cline

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

VS Code

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

Gemini CLI

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

Claude Desktop

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

Windsurf

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

Let your agent find its tools

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