50+ Ukrainian legal sources, 120+ tools: laws on any date, case law, courts, companies, sanctions.
Maintained bymerit.legal(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Run a catalog tool with its arguments. It is validated, limited, billed and answered exactly as a listed tool would be.
Tool name, from catalog__search.
That tool's arguments, per catalog__describe.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http law https://law.merit.legal/mcp
Run a catalog tool with its arguments. It is validated, limited, billed and answered exactly as a listed tool would be.
| Argument | Type | Description |
|---|---|---|
| tool* | string | Tool name, from catalog__search. |
| arguments | object | That tool's arguments, per catalog__describe. |
{
"type": "object",
"required": [
"tool"
],
"properties": {
"tool": {
"type": "string",
"description": "Tool name, from catalog__search."
},
"arguments": {
"type": "object",
"description": "That tool's arguments, per catalog__describe.",
"additionalProperties": true
}
}
}A catalog tool's full description and input schema, as tools/list would publish it.
| Argument | Type | Description |
|---|---|---|
| tool* | string | Tool name, from catalog__search. |
{
"type": "object",
"required": [
"tool"
],
"properties": {
"tool": {
"type": "string",
"description": "Tool name, from catalog__search."
}
}
}Find tools left out of this list (the catalog) by topic. Each hit is a tool name and its first sentence; an empty result means no catalog tool mentions those words.
| Argument | Type | Description |
|---|---|---|
| q | string | Words to find in tool names and descriptions, e.g. 'notary', 'lost passport', 'trademark'. Empty lists the whole catalog. |
| source | string | Only this source's tools, e.g. ua_notaries. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"default": "",
"description": "Words to find in tool names and descriptions, e.g. 'notary', 'lost passport', 'trademark'. Empty lists the whole catalog."
},
"source": {
"type": "string",
"description": "Only this source's tools, e.g. ua_notaries."
}
}
}Search the EU consolidated financial sanctions list (persons and enterprises) by name or alias. Returns matching listed parties with their aliases, listing regulation, and identifying details, plus a `stale` flag when the underlying snapshot is older than the freshness window.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Name, alias or exact ID number. |
| subject_type | string | Restrict to 'person' or 'enterprise'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 100,
"minimum": 1
},
"query": {
"type": "string",
"description": "Name, alias or exact ID number."
},
"subject_type": {
"type": "string",
"description": "Restrict to 'person' or 'enterprise'."
}
}
}Search the US Treasury OFAC Specially Designated Nationals (SDN) list (individuals, entities, vessels, and aircraft) by name or alias. Returns matching listed parties with their aliases, sanctions programs, and identifying details, plus `stale`/`available` flags describing how current the underlying snapshot is.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Name, alias or exact ID number. |
| subject_type | string | Restrict to 'individual', 'entity', 'vessel', or 'aircraft'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"query": {
"type": "string",
"description": "Name, alias or exact ID number."
},
"subject_type": {
"type": "string",
"description": "Restrict to 'individual', 'entity', 'vessel', or 'aircraft'."
}
}
}One bankruptcy case's announcement history and current procedural stage, newest first. `current_stage` is the most recent announcement's type. The registry publishes no case-level status record, so the latest publication is the only statement of where the case stands, and `debtor_code`, `debtor_name` and `court_name` are read off that same announcement. Check `mirror.ready` to tell "no proceedings published" apart from an unsynced mirror.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| case_number* | string | Exact case number, slashes included. |
{
"type": "object",
"required": [
"case_number"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 1
},
"case_number": {
"type": "string",
"description": "Exact case number, slashes included."
}
}
}Ukrainian bankruptcy and insolvency announcements (ДСА registry). One result is one published announcement, not one case. A case accumulates announcements as it proceeds and long-running cases have hundreds, so use `get_case` for one case's history and current stage. Company names are stored in full legal form and in capitals, so a distinctive fragment of the trade name works far better than an exact name. `debtor_code` is the reliable way to identify a party.
| Argument | Type | Description |
|---|---|---|
| court | string | Court name fragment. |
| limit | integer | |
| query | string | Debtor name, matched anywhere in the string. |
| offset | integer | |
| case_number | string | Exact case number. |
| debtor_code | string | Exact ЄДРПОУ (company) or РНОКПП (individual). |
| announcement_type | string | Exact announcement type, in Ukrainian. |
{
"type": "object",
"properties": {
"court": {
"type": "string",
"description": "Court name fragment."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 1
},
"query": {
"type": "string",
"description": "Debtor name, matched anywhere in the string."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"case_number": {
"type": "string",
"description": "Exact case number."
},
"debtor_code": {
"type": "string",
"description": "Exact ЄДРПОУ (company) or РНОКПП (individual)."
},
"announcement_type": {
"type": "string",
"description": "Exact announcement type, in Ukrainian."
}
}
}Ukraine's register of persons who committed corruption or corruption-related offences (НАЗК). An entry records one offender, the offence, the article they were held liable under, the sanction, and the court decision or disciplinary decree that imposed it. Most entries are natural persons sanctioned by a court. `sentence_number`, where present, is the decision's ЄДРСР id, so an entry can be checked against the decisions register itself. This source publishes no freshness of its own, so `as_of` is mirror sync date.
| Argument | Type | Description |
|---|---|---|
| q | string | Free text over name, offence, article, court and case. |
| limit | integer | |
| offset | integer | |
| date_to | string | Inclusive ISO date. |
| date_from | string | Inclusive ISO date. |
| entity_type | string | Фізична особа or Юридична особа. |
| punishment_type | string | Судове рішення or Дисциплінарне стягнення. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free text over name, offence, article, court and case."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"date_to": {
"type": "string",
"description": "Inclusive ISO date."
},
"date_from": {
"type": "string",
"description": "Inclusive ISO date."
},
"entity_type": {
"type": "string",
"description": "Фізична особа or Юридична особа."
},
"punishment_type": {
"type": "string",
"description": "Судове рішення or Дисциплінарне стягнення."
}
}
}Hearings scheduled in Ukrainian courts (Список справ, призначених до розгляду), every court, read daily from court.gov.ua (a court listing on its own portal instead: source=courtportal). The source lists today onward; past hearings stay here as last listed. Needs case_number, court_code or q.
| Argument | Type | Description |
|---|---|---|
| q | string | Words in parties, subject or judge. |
| limit | integer | |
| offset | integer | |
| date_to | string | On or before. |
| date_from | string | On or after. |
| court_code | string | EDRSR court code, e.g. 2610. |
| case_number | string | Exact case number, e.g. 761/21700/26. |
| include_removed | boolean | Also hearings dropped before their date (moved/cancelled). |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Words in parties, subject or judge."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"date_to": {
"type": "string",
"format": "date",
"description": "On or before."
},
"date_from": {
"type": "string",
"format": "date",
"description": "On or after."
},
"court_code": {
"type": "string",
"description": "EDRSR court code, e.g. 2610."
},
"case_number": {
"type": "string",
"description": "Exact case number, e.g. 761/21700/26."
},
"include_removed": {
"type": "boolean",
"default": false,
"description": "Also hearings dropped before their date (moved/cancelled)."
}
}
}One consumer price index figure by period. `base_period` defaults to the month-on-month series, which is what Article 625(2) of the Civil Code is computed from. This is Derzhstat's consumer price index, not a producer price index and not the NBU's mixed series. A period the mirror does not hold returns `found: false` rather than an error. Check `source.latest_period` and `source.mirror_ready` to tell "not published" from "not synced".
| Argument | Type | Description |
|---|---|---|
| freq | string | 'M' monthly or 'A' annual. |
| period* | string | ISO period: 2026-07 or 2025. |
| base_period | string | Derzhstat BASE_PERIOD code, e.g. PREV_MONTH. |
{
"type": "object",
"required": [
"period"
],
"properties": {
"freq": {
"type": "string",
"default": "M",
"description": "'M' monthly or 'A' annual."
},
"period": {
"type": "string",
"description": "ISO period: 2026-07 or 2025."
},
"base_period": {
"type": "string",
"default": "PREV_MONTH",
"description": "Derzhstat BASE_PERIOD code, e.g. PREV_MONTH."
}
}
}Every debtor listed under one enforcement-proceeding number. Always a list: one proceeding can be enforced against several debtors, so a number legitimately has several answers.
| Argument | Type | Description |
|---|---|---|
| proceeding_number* | string | Enforcement-proceeding number, e.g. 71234567. |
{
"type": "object",
"required": [
"proceeding_number"
],
"properties": {
"proceeding_number": {
"type": "string",
"description": "Enforcement-proceeding number, e.g. 71234567."
}
}
}Ukraine's Unified Register of Debtors (Єдиний реєстр боржників, ЄРБ): persons with an open, unsatisfied enforcement proceeding. An entry is dropped at the first daily sync after its proceeding closes, so "not listed" means nothing was open as of `as_of`, never that nothing ever was. The register publishes no dates, so rows carry none and arrive in arbitrary order. `ua_enforcement_proceedings` also holds closed and refused proceedings.
| Argument | Type | Description |
|---|---|---|
| q | string | Word search over debtor name, code and proceeding number. All words must match; each matches as a prefix. Not the office -- see `executor_department` on the explorer. |
| limit | integer | |
| offset | integer | |
| category | string | Exact claim category. |
| debtor_code | string | Exact ЄДРПОУ or РНОКПП. |
| debtor_kind | string | фізична особа, юридична особа or невідомо. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Word search over debtor name, code and proceeding number. All words must match; each matches as a prefix. Not the office -- see `executor_department` on the explorer."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"category": {
"type": "string",
"description": "Exact claim category."
},
"debtor_code": {
"type": "string",
"description": "Exact ЄДРПОУ or РНОКПП."
},
"debtor_kind": {
"type": "string",
"description": "фізична особа, юридична особа or невідомо."
}
}
}One HUDOC document by `itemid`, adding cited Strasbourg case law, domestic law at issue, judges.
| Argument | Type | Description |
|---|---|---|
| itemid* | string | HUDOC item id from a search hit, e.g. '001-219403'. |
{
"type": "object",
"required": [
"itemid"
],
"properties": {
"itemid": {
"type": "string",
"description": "HUDOC item id from a search hit, e.g. '001-219403'."
}
}
}Search ECHR (European Court of Human Rights) case law via HUDOC, scoped to cases against Ukraine: judgments, decisions and communicated cases with application number(s), engaged articles, importance level, conclusion and a HUDOC permalink, including Ukrainian translations where HUDOC holds one. A live lookup with a short-lived cache, not a stored dataset.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Words from the case name or judgment text. |
| start | integer | Offset into the result set. |
| article | string | Restrict to a Convention article, e.g. '6'. |
| language | string | Restrict to 'ENG' or 'UKR'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"description": "Words from the case name or judgment text."
},
"start": {
"type": "integer",
"default": 0,
"maximum": 100000,
"minimum": 0,
"description": "Offset into the result set."
},
"article": {
"type": "string",
"description": "Restrict to a Convention article, e.g. '6'."
},
"language": {
"type": "string",
"description": "Restrict to 'ENG' or 'UKR'."
}
}
}One legal entity by ЄДРПОУ code or `record`, with its people. `people`: founders, beneficial owners, signers and board members; the head is the latest appointment. `company` adds termination, bankruptcy, succession, branches and tax registration. `history`: changes per weekly release since tracking began; `on_date`: people then. Earlier history: paid НАІС extract only. A code shared by several subjects returns the live one, the rest in `other_subjects`. No address or КВЕД codes upstream.
| Argument | Type | Description |
|---|---|---|
| edrpou | string | ЄДРПОУ code, e.g. 00032129. |
| record | integer | ЄДР subject id, from a hit. |
| history | boolean | Add the change log. |
| on_date | string | Add people as of this date. |
{
"type": "object",
"properties": {
"edrpou": {
"type": "string",
"description": "ЄДРПОУ code, e.g. 00032129."
},
"record": {
"type": "integer",
"description": "ЄДР subject id, from a hit."
},
"history": {
"type": "boolean",
"default": false,
"description": "Add the change log."
},
"on_date": {
"type": "string",
"format": "date",
"description": "Add people as of this date."
}
}
}One ФОП by `record`: termination entry and reason, annulled termination, farm-household flag, property manager, tax/ЄСВ registration.
| Argument | Type | Description |
|---|---|---|
| record* | integer | ЄДР subject id, from a search_fop hit. |
| history | boolean | Add the change log. |
{
"type": "object",
"required": [
"record"
],
"properties": {
"record": {
"type": "integer",
"description": "ЄДР subject id, from a search_fop hit."
},
"history": {
"type": "boolean",
"default": false,
"description": "Add the change log."
}
}
}Ukrainian legal entities in the open ЄДР extract (Єдиний державний реєстр юридичних осіб). Legal entities only; ФОП are `search_fop`. The open extract publishes neither the registered address (місцезнаходження) nor КВЕД activity codes. Both were withdrawn upstream for security reasons, so they are absent rather than lost and no response can supply them; only a paid НАІС/Дія extract carries them. `q` does not reach officers or founders. `lookup` returns those.
| Argument | Type | Description |
|---|---|---|
| q | string | Free text over the ЄДРПОУ code and the names. |
| limit | integer | |
| offset | integer | |
| status | string | Canonical registration status. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free text over the ЄДРПОУ code and the names."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"status": {
"type": "string",
"description": "Canonical registration status."
}
}
}ФОП (фізичні особи-підприємці) in the open ЄДР extract, by name (ПІБ), status and registration/termination date. Ordered by the filtered date, else `record`. No РНОКПП, address or КВЕД upstream: namesakes cannot be told apart, so a name hit alone does not identify a person.
| Argument | Type | Description |
|---|---|---|
| q | string | Words of the ПІБ; each a prefix, all required. |
| limit | integer | |
| offset | integer | |
| status | string | Canonical registration status. |
| registered_to | string | |
| terminated_to | string | |
| registered_from | string | YYYY-MM-DD, inclusive. |
| terminated_from | string |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Words of the ПІБ; each a prefix, all required."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"status": {
"type": "string",
"description": "Canonical registration status."
},
"registered_to": {
"type": "string",
"format": "date"
},
"terminated_to": {
"type": "string",
"format": "date"
},
"registered_from": {
"type": "string",
"format": "date",
"description": "YYYY-MM-DD, inclusive."
},
"terminated_from": {
"type": "string",
"format": "date"
}
}
}Court practice on one statute article: which cases cite it, by court and year, ranked highest authority first. Spellings of one code answer alike ('ККУ', 'КК України') and mean the code in force; `repealed_excluded` lists repealed namesakes' nregs. `index_coverage.status` says what `total_cases` means (a real zero, or unresolved citations); under `index_unavailable` it is null, not a count.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max rows to return (0-200); 0 returns the count alone. |
| facet_size | integer | Max facet buckets to return (1-1000). |
| abbreviation* | string | Code abbreviation (ККУ), or act nreg or title. |
| article_number* | string | Article number as written, e.g. 185. |
| clause_component | string | Частина/пункт; narrows to clause-depth citations. |
{
"type": "object",
"required": [
"abbreviation",
"article_number"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 0,
"description": "Max rows to return (0-200); 0 returns the count alone."
},
"facet_size": {
"type": "integer",
"default": 20,
"maximum": 1000,
"minimum": 1,
"description": "Max facet buckets to return (1-1000)."
},
"abbreviation": {
"type": "string",
"description": "Code abbreviation (ККУ), or act nreg or title."
},
"article_number": {
"type": "string",
"description": "Article number as written, e.g. 185."
},
"clause_component": {
"type": "string",
"description": "Частина/пункт; narrows to clause-depth citations."
}
}
}One decision: its text, its citations, its structural parts. Text is windowed, never dumped whole. `text_window` says what came back and how to get the rest. Citations cover that window only, with `*_outside_window` counting the rest; repeats of one case roll up into `occurrences`. Citations carry what was written and what it resolved to, so an unresolved one stays visible. Join on `resolved_cause_num`, not the written number.
| Argument | Type | Description |
|---|---|---|
| doc_id* | integer | Document id. |
| offset | integer | Characters to skip, for paging. |
| section | array | Parts to return text for: preamble, reasoning (what the court found), operative (what it ordered). Omit for all. |
| max_chars | integer | Cap on returned text characters; text_window.next_offset continues. |
| include_html | boolean | Also return canonical HTML (tables, emphasis, superscripts the text flattens). Always whole: the window cuts text, which offsets index. |
{
"type": "object",
"required": [
"doc_id"
],
"properties": {
"doc_id": {
"type": "integer",
"description": "Document id."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Characters to skip, for paging."
},
"section": {
"type": "array",
"items": {
"type": "string"
},
"description": "Parts to return text for: preamble, reasoning (what the court found), operative (what it ordered). Omit for all."
},
"max_chars": {
"type": "integer",
"default": 25000,
"maximum": 100000,
"minimum": 1,
"description": "Cap on returned text characters; text_window.next_offset continues."
},
"include_html": {
"type": "boolean",
"default": false,
"description": "Also return canonical HTML (tables, emphasis, superscripts the text flattens). Always whole: the window cuts text, which offsets index."
}
}
}One case by document id or case number, with the cases related to it. Give exactly one of `doc_id` or `cause_num`. Highest instance first, judgments before rulings, newest first. `related_cases` is citation-graph overlap, never semantic similarity or a judgement on merits, and may repeat a decision from `matches`. `score` weights each shared anchor and case by rarity, so boilerplate ranks near nothing. `departures`/`departed_by`: Supreme Court departures read from the texts.
| Argument | Type | Description |
|---|---|---|
| doc_id | integer | Document id. |
| offset | integer | |
| cause_num | string | Case number. Cyrillic case variants all match. |
| max_chars | integer | Cap on response characters; related-case evidence fits it. |
| match_limit | integer | Max decisions per case to return (1-25). |
| related_limit | integer | Max rows to return (0-200); 0 returns the count alone. |
{
"type": "object",
"properties": {
"doc_id": {
"type": "integer",
"description": "Document id."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"cause_num": {
"type": "string",
"description": "Case number. Cyrillic case variants all match."
},
"max_chars": {
"type": "integer",
"default": 25000,
"maximum": 100000,
"minimum": 1,
"description": "Cap on response characters; related-case evidence fits it."
},
"match_limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1,
"description": "Max decisions per case to return (1-25)."
},
"related_limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 0,
"description": "Max rows to return (0-200); 0 returns the count alone."
}
}
}Faceted full-text search over Ukrainian court decisions (ЄДРСР). Decision text comes from `get_document`. `doc_type_name` tells a procedural ruling (Ухвала) from a merits judgment without fetching it. `q` is lemmatized inside the index; do not stem it first. Integer filters OR within, AND across. A null `total` is the index not answering, not a no-match.
| Argument | Type | Description |
|---|---|---|
| q | string | Free-text query, in the user's own words. |
| judge | string | Exact judge name; Cyrillic case is folded. |
| limit | integer | Max rows to return (0-200); 0 returns the count alone. |
| offset | integer | |
| status | array | Decision status codes. |
| date_to | string | Inclusive ISO date. |
| instance | array | 1 cassation, 2 appellate, 3 first instance. |
| date_from | string | Inclusive ISO date. |
| court_code | array | Court codes. |
| cited_dokid | array | Only decisions citing these ua_law document ids. |
| justice_kind | array | Justice-kind codes. |
| category_code | array | Case-category codes. |
| judgment_code | array | Judgment-form codes; see list_dict_values. |
| resolution_depth | array | Document-level rollup: none, article, clause. |
| exclude_judgment_code | array | Codes to drop; 5 is Ухвала, the procedural ruling. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free-text query, in the user's own words."
},
"judge": {
"type": "string",
"description": "Exact judge name; Cyrillic case is folded."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 0,
"description": "Max rows to return (0-200); 0 returns the count alone."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"status": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Decision status codes."
},
"date_to": {
"type": "string",
"description": "Inclusive ISO date."
},
"instance": {
"type": "array",
"items": {
"type": "integer"
},
"description": "1 cassation, 2 appellate, 3 first instance."
},
"date_from": {
"type": "string",
"description": "Inclusive ISO date."
},
"court_code": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Court codes."
},
"cited_dokid": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Only decisions citing these ua_law document ids."
},
"justice_kind": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Justice-kind codes."
},
"category_code": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Case-category codes."
},
"judgment_code": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Judgment-form codes; see list_dict_values."
},
"resolution_depth": {
"type": "array",
"items": {
"type": "string"
},
"description": "Document-level rollup: none, article, clause."
},
"exclude_judgment_code": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Codes to drop; 5 is Ухвала, the procedural ruling."
}
}
}Every row published under one enforcement-proceeding number. Always a list: a proceeding with several debtors is published as one row per debtor. `matches` is capped at 200.
| Argument | Type | Description |
|---|---|---|
| vp_num* | string | Proceeding number, e.g. 71234567. |
{
"type": "object",
"required": [
"vp_num"
],
"properties": {
"vp_num": {
"type": "string",
"description": "Proceeding number, e.g. 71234567."
}
}
}АСВП, Ukraine's register of enforcement proceedings (виконавчі провадження). Wider than ЄРБ (`ua_debtors`): it keeps closed ('Завершено') and refused ('Відмовлено у відкритті') proceedings too. The shared key is `vp_num`. `debtor_code` is published for legal entities only, about 9% of rows. The source carries no identifier at all for a natural-person debtor, so a null code means the source publishes none, not that parsing failed.
| Argument | Type | Description |
|---|---|---|
| q | string | Prefix of the debtor's name. |
| limit | integer | |
| offset | integer | |
| vp_num | string | Exact proceeding number. |
| opened_to | string | Inclusive ISO date. |
| debtor_code | string | Exact ЄДРПОУ; legal entities only. |
| opened_from | string | Inclusive ISO date. |
| proceeding_state | string | Exact state string as published. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Prefix of the debtor's name."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"vp_num": {
"type": "string",
"description": "Exact proceeding number."
},
"opened_to": {
"type": "string",
"description": "Inclusive ISO date."
},
"debtor_code": {
"type": "string",
"description": "Exact ЄДРПОУ; legal entities only."
},
"opened_from": {
"type": "string",
"description": "Inclusive ISO date."
},
"proceeding_state": {
"type": "string",
"description": "Exact state string as published."
}
}
}Whether one date is a public holiday or non-working day in Ukraine. `is_holiday` is true, false, or **null** -- null when `covered` is false, i.e. the mirror has not computed that year. Null is not "no": a deadline calculation must be able to tell "this is a working day" from "this source cannot say". `matches` carries the day with its name and verbatim statute line; a list, as a movable feast and a dated holiday can coincide. `is_holiday` means ст. 73 lists the day. During martial law ст. 73 does not apply: see `martial_law.suspends_holidays`, null past the decreed end.
| Argument | Type | Description |
|---|---|---|
| date* | string | ISO date, YYYY-MM-DD. |
{
"type": "object",
"required": [
"date"
],
"properties": {
"date": {
"type": "string",
"description": "ISO date, YYYY-MM-DD."
}
}
}One act's card, by registration number. No text: use `get_document_toc` then `get_unit_fulltext`. `urn_current_edition` is null unless an edition is in force today -- a repealed act has none; `urn_latest_edition` is the newest text in effect today whatever the status; `urn_next_edition`, text scheduled to take effect later. Editions '30000101' and up await a date not yet fixed (e.g. end of martial law) and are none of these.
| Argument | Type | Description |
|---|---|---|
| nreg* | string | Registration number, e.g. 168/97-вр. |
| offset | integer | |
| relation | string | A `relation_counts` name: list those acts, 50 a page. |
{
"type": "object",
"required": [
"nreg"
],
"properties": {
"nreg": {
"type": "string",
"description": "Registration number, e.g. 168/97-вр."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"relation": {
"type": "string",
"description": "A `relation_counts` name: list those acts, 50 a page."
}
}
}One document's units in reading order -- and the article resolver: `kind='article'` with `number='626'` returns that article alone, `urn` included. Structure only. Each entry carries the `urn` `get_unit_fulltext` takes and a `heading`, or for a clause its opening paragraph as `lead_text` with `text_chars` for the provision's full length. Filter, do not page: the Civil Code is 5,431 units, 1,329 of them articles.
| Argument | Type | Description |
|---|---|---|
| kind | string | One unit kind: annex, article, chapter, clause, document, par_group, part, sub_clause, sub_point, subpart. |
| nreg* | string | Registration number, e.g. 168/97-вр. |
| limit | integer | |
| number | string | Unit's printed number, e.g. 626. |
| offset | integer | |
| edition_date | string | Edition id from a URN's @suffix. Omit for current. |
{
"type": "object",
"required": [
"nreg"
],
"properties": {
"kind": {
"type": "string",
"description": "One unit kind: annex, article, chapter, clause, document, par_group, part, sub_clause, sub_point, subpart."
},
"nreg": {
"type": "string",
"description": "Registration number, e.g. 168/97-вр."
},
"limit": {
"type": "integer",
"default": 200,
"maximum": 500,
"minimum": 1
},
"number": {
"type": "string",
"description": "Unit's printed number, e.g. 626."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"edition_date": {
"type": "string",
"description": "Edition id from a URN's @suffix. Omit for current."
}
}
}Metadata for one structural unit, addressed by its URN. `urn` is 'urn:ua:law:{nreg}:{path}@{YYYYMMDD}'. Drop '@{YYYYMMDD}' for today's edition; drop the path too for the whole document. Take one from a filtered `get_document_toc` rather than building it. A URN resolving to no unit answers 'not_found' with the nearest real units either side and `same_segment` -- real paths ending in the segment asked for, the hint when the right article was guessed under a wrong ancestor.
| Argument | Type | Description |
|---|---|---|
| urn* | string | Unit URN, from get_document_toc. |
{
"type": "object",
"required": [
"urn"
],
"properties": {
"urn": {
"type": "string",
"description": "Unit URN, from get_document_toc."
}
}
}The editions on which one unit's text changed, and what changed it. Each entry is a version: its dated `urn`, how many editions kept it, and `amended_by`, the acts behind the change ('unit_notes': cited by the unit's notes; 'edition_basis': the edition's basis). `removed`: the unit disappears; `moved_from`: its address changed (`text_changed` false if only that). A `baseline` opens the list: the first text, or with `from_date` the text in force that day. Edition '30000101' and up (`edition_date` null) takes effect on a date not yet fixed. `complete: false` means `limit` cut older entries.
| Argument | Type | Description |
|---|---|---|
| urn* | string | Unit URN, from get_document_toc. |
| limit | integer | Editions to read text for, newest first. |
| to_date | string | Latest edition, inclusive. |
| from_date | string | Earliest edition, inclusive. |
{
"type": "object",
"required": [
"urn"
],
"properties": {
"urn": {
"type": "string",
"description": "Unit URN, from get_document_toc."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Editions to read text for, newest first."
},
"to_date": {
"type": "string",
"description": "Latest edition, inclusive."
},
"from_date": {
"type": "string",
"description": "Earliest edition, inclusive."
}
}
}Unit text, paged. Past `max_chars` it is `truncated`: pass `next_cursor` as `cursor` for more. Pages end after a paragraph, else after a space, else mid-word (a tiny `max_chars`). Only page 1 lists `parts`, sub-units with their own `urn`, unless `parts_offset` is passed. `text: null` with status 'edition_text_unavailable' (edition not stored) or 'extraction_failed' (unit not cut out) is a unit that DOES exist -- not a repeal. No unit at that address answers 'not_found'.
| Argument | Type | Description |
|---|---|---|
| urn* | string | Unit URN, from get_document_toc. |
| cursor | string | A `next_cursor`. |
| max_chars | integer | Page size; 0: `parts` only. |
| parts_offset | integer | Start of `parts`. |
{
"type": "object",
"required": [
"urn"
],
"properties": {
"urn": {
"type": "string",
"description": "Unit URN, from get_document_toc."
},
"cursor": {
"type": "string",
"description": "A `next_cursor`."
},
"max_chars": {
"type": "integer",
"default": 20000,
"maximum": 100000,
"minimum": 0,
"description": "Page size; 0: `parts` only."
},
"parts_offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "Start of `parts`."
}
}
}Whether one unit was legally in force on a given date. `in_force` is true, false, or null when the corpus cannot tell. `outcome` 'deterministic' is from the portal's own events or edition history, anything else from AI review of the text. An undated URN asks about the provision; a dated one about that version of its text: false once replaced (`scope` 'version', `version_in_force_urn`). `decided_for_provision` false: the answer is the act's, possibly wrong for an article inserted or deleted mid-life. `source: 'no_force_event'`: none ever recorded -- read `document_status_name`.
| Argument | Type | Description |
|---|---|---|
| urn* | string | Unit URN, from get_document_toc. |
| date* | string | Day to test. |
{
"type": "object",
"required": [
"urn",
"date"
],
"properties": {
"urn": {
"type": "string",
"description": "Unit URN, from get_document_toc."
},
"date": {
"type": "string",
"description": "Day to test."
}
}
}Several units' text in one call: a norm and what it relies on. `units` answers each URN in order as `get_unit_fulltext` would, sharing one `max_chars`: a unit that does not fit is `truncated` with a `next_cursor`, and units past the budget come back with no text. A URN matching nothing is its own 'not_found' entry.
| Argument | Type | Description |
|---|---|---|
| urns* | array | Unit URNs, answered in this order. |
| max_chars | integer | Page size; 0: `parts` only. |
{
"type": "object",
"required": [
"urns"
],
"properties": {
"urns": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"minItems": 1,
"description": "Unit URNs, answered in this order."
},
"max_chars": {
"type": "integer",
"default": 20000,
"maximum": 100000,
"minimum": 0,
"description": "Page size; 0: `parts` only."
}
}
}Search Ukrainian legislation by free text and/or metadata filters. One entry per matching document, carrying the `nreg` `get_document_toc` takes. Never text. `in_force_on_date` keeps only acts the portal's own commencement and repeal events put in force that day, dropping any act with no such event recorded. `total` counts what it kept; `total_relation: 'gte'` marks a floor.
| Argument | Type | Description |
|---|---|---|
| text | string | Free text over document titles. |
| limit | integer | |
| topic | any | Topic id; see list_dict_values. |
| offset | integer | |
| status | any | Status id; see list_dict_values. |
| type_id | any | Type id; see list_dict_values. |
| in_scope | boolean | Only legislation the corpus treats as in scope. |
| in_force_on_date | string | In force on this day. |
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "Free text over document titles."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"topic": {
"anyOf": [
{
"type": "integer"
},
{
"type": "array",
"items": {
"type": "integer"
}
}
],
"description": "Topic id; see list_dict_values."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"status": {
"anyOf": [
{
"type": "integer"
},
{
"type": "array",
"items": {
"type": "integer"
}
}
],
"description": "Status id; see list_dict_values."
},
"type_id": {
"anyOf": [
{
"type": "integer"
},
{
"type": "array",
"items": {
"type": "integer"
}
}
],
"description": "Type id; see list_dict_values."
},
"in_scope": {
"type": "boolean",
"description": "Only legislation the corpus treats as in scope."
},
"in_force_on_date": {
"type": "string",
"description": "In force on this day."
}
}
}Find provisions by their text: which articles, points or clauses say X. Every word of `text` must appear (quote it for an exact phrase). Searches the text as published on `on_date` (default today); `nreg` limits it to acts. Each hit is the smallest unit holding it, with that day's `urn`. ⟦ ⟧ in `excerpt` mark matches, not the law's text. `amending_act` hits restate other acts. `search` finds acts by title.
| Argument | Type | Description |
|---|---|---|
| nreg | array | Only these acts. |
| text* | string | Words to find. |
| limit | integer | |
| offset | integer | |
| on_date | string | Text as published that day. |
| per_act | integer | Hits per act, 0: all (default 3; 1 act: all). |
| amending_acts | boolean | False: no amending laws. |
{
"type": "object",
"required": [
"text"
],
"properties": {
"nreg": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only these acts."
},
"text": {
"type": "string",
"minLength": 1,
"description": "Words to find."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"on_date": {
"type": "string",
"pattern": "^(\\d{4}-\\d{2}-\\d{2}|\\d{8})$",
"description": "Text as published that day."
},
"per_act": {
"type": "integer",
"minimum": 0,
"description": "Hits per act, 0: all (default 3; 1 act: all)."
},
"amending_acts": {
"type": "boolean",
"default": true,
"description": "False: no amending laws."
}
}
}Судовий збір for a claim, or an appeal/cassation against the judgment, in a civil, commercial or administrative court (ст. 4 Закону № 3674-VI). Base: able-bodied прожитковий мінімум on 1 January of the filing year (minimum wage 2011-2016). Returns amount, formula and provisions. Rates are the law's current text; an older filing may have owed another rate. Not covered (error): special claims, court orders, appeals against rulings, bankruptcy, exemptions.
| Argument | Type | Description |
|---|---|---|
| court* | string | civil | commercial | administrative. |
| filer* | string | legal_entity | individual | fop | authority (administrative). |
| filing | string | claim | appeal | cassation. |
| claim_kind* | string | property | non_property. |
| electronic | boolean | Filed electronically (×0.8). |
| filing_date | string | Picks the year's base. Default today. |
| claim_amount | number | UAH; required for property claims. |
{
"type": "object",
"required": [
"court",
"claim_kind",
"filer"
],
"properties": {
"court": {
"type": "string",
"description": "civil | commercial | administrative."
},
"filer": {
"type": "string",
"description": "legal_entity | individual | fop | authority (administrative)."
},
"filing": {
"type": "string",
"default": "claim",
"description": "claim | appeal | cassation."
},
"claim_kind": {
"type": "string",
"description": "property | non_property."
},
"electronic": {
"type": "boolean",
"default": false,
"description": "Filed electronically (×0.8)."
},
"filing_date": {
"type": "string",
"description": "Picks the year's base. Default today."
},
"claim_amount": {
"type": "number",
"description": "UAH; required for property claims."
}
}
}Value of a legal indicator in force on a date, with the act and article that set it. nbu_discount_rate: NBU облікова ставка, % p.a., since 1992. pm_general, pm_child_under_6, pm_child_6_18, pm_able_bodied, pm_disabled: прожитковий мінімум, from 2005. min_wage_monthly (from 2009-11), min_wage_hourly (from 2010). Statutory figures are curated from the budget laws. found=false with a reason: outside coverage, next year's law not curated yet, or NBU not synced. Exchange rates: ua_nbu_rate; CPI: ua_cpi_inflation.
| Argument | Type | Description |
|---|---|---|
| on_date | string | Default today (Kyiv). |
| indicator* | string | Indicator name, see the tool description. |
{
"type": "object",
"required": [
"indicator"
],
"properties": {
"on_date": {
"type": "string",
"description": "Default today (Kyiv)."
},
"indicator": {
"type": "string",
"description": "Indicator name, see the tool description."
}
}
}One legal position, with its text and published markup. Pass a search hit's `position_id`. `text` is plain, `text_html` as published. `norm_refs` dates each statute quoted to the `ua_law` edition then in force, with a `urn` `ua_law__get_unit_fulltext` takes, to compare with today's text. `departs_from`/`departed_in` link departures, read from position texts; `history` has the detail. `approved_at` is NOT a publication date: its absence says nothing about whether a position is current.
| Argument | Type | Description |
|---|---|---|
| position_id* | integer | From a search result. |
{
"type": "object",
"required": [
"position_id"
],
"properties": {
"position_id": {
"type": "integer",
"description": "From a search result."
}
}
}The Supreme Court's legal positions (правові позиції). A position is an analyst's short statement of what the Court held, not a quotation, filed under a classifier and linked to its source decisions. ЄДРСР has the judgments, not which passage is the holding. Hits omit the text unless `full_text`; `position` serves it. `mark` `indented`: the position departs from (or refines) an earlier holding; `modified`: a later decision departed from or refined it. `norm_refs` dates each norm it quotes to the edition then in force.
| Argument | Type | Description |
|---|---|---|
| q | string | Words over the position's title and text; each must occur, any order or form. |
| limit | integer | |
| doc_id | integer | ЄДРСР document id. |
| offset | integer | |
| full_text | boolean | Carry every hit's position text (off by default). |
| court_code | any | ЄДРСР court codes of the decisions a position cites, OR-ed: 9911 КГС, 9921 КАС, 9931 КЦС, 9941 ККС, 9951 Велика Палата. |
| case_number | string | Case number, e.g. 320/11927/22. |
| category_id | integer | Classifier node; matches its whole subtree. |
| jurisdiction | string | kas, kks, kcs, kgs or vp (Grand Chamber). |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Words over the position's title and text; each must occur, any order or form."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 200,
"minimum": 1
},
"doc_id": {
"type": "integer",
"description": "ЄДРСР document id."
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"full_text": {
"type": "boolean",
"default": false,
"description": "Carry every hit's position text (off by default)."
},
"court_code": {
"anyOf": [
{
"type": "integer"
},
{
"type": "array",
"items": {
"type": "integer"
}
}
],
"description": "ЄДРСР court codes of the decisions a position cites, OR-ed: 9911 КГС, 9921 КАС, 9931 КЦС, 9941 ККС, 9951 Велика Палата."
},
"case_number": {
"type": "string",
"description": "Case number, e.g. 320/11927/22."
},
"category_id": {
"type": "integer",
"description": "Classifier node; matches its whole subtree."
},
"jurisdiction": {
"type": "string",
"description": "kas, kks, kcs, kgs or vp (Grand Chamber)."
}
}
}Look up the National Bank of Ukraine's official exchange rate (UAH per unit) for a currency, as of a given date or today if none is given. Supports historical dates for ЦК §533 п.2-style currency-conversion calculations, not only the current rate. Returns `available: false` with a null rate, rather than an error, when NBU has nothing published for the requested currency or date.
| Argument | Type | Description |
|---|---|---|
| date | string | YYYY-MM-DD. Defaults to today (Kyiv) when omitted. |
| currency* | string | ISO 4217 alphabetic code, e.g. USD. |
{
"type": "object",
"required": [
"currency"
],
"properties": {
"date": {
"type": "string",
"description": "YYYY-MM-DD. Defaults to today (Kyiv) when omitted."
},
"currency": {
"type": "string",
"description": "ISO 4217 alphabetic code, e.g. USD."
}
}
}One Supreme Court publication's extracted text, `document_url`, cited case numbers and linked ЄДРСР `edrsr_ids` -- only this tool returns them. These are analytical reports, not judgments, averaging ~128,000 characters, so a window from the start is usually cover page and contents. Pass `text_query` to open it at the passage you want. `char_count` is the full length; `has_more` whether more follows. `extract_status` says why there is no text: `empty` is a scan with no OCR layer, one in nine; `failed` errored; `unsupported` is not a PDF.
| Argument | Type | Description |
|---|---|---|
| text_limit | integer | Characters to return. Pass 1 for metadata and `case_refs` without the text. |
| text_query | string | Open the window at this term, searching from `text_offset`; pass the last window's end for the next hit. |
| document_id* | string | From a search result. |
| text_offset | integer | 0-based character offset into the text. |
{
"type": "object",
"required": [
"document_id"
],
"properties": {
"text_limit": {
"type": "integer",
"default": 5000,
"maximum": 200000,
"minimum": 1,
"description": "Characters to return. Pass 1 for metadata and `case_refs` without the text."
},
"text_query": {
"type": "string",
"description": "Open the window at this term, searching from `text_offset`; pass the last window's end for the next hit."
},
"document_id": {
"type": "string",
"description": "From a search result."
},
"text_offset": {
"type": "integer",
"default": 0,
"minimum": 0,
"description": "0-based character offset into the text."
}
}
}The Supreme Court's analytical publications: дайджести, огляди and узагальнення судової практики, plus the наукові висновки НКР при ВС. Not in ЄДРСР, which has the judgments but no positions by dispute category. `document` returns the text, link and case numbers. `court_body` `vs` is a cross-cutting digest of no single cassation court (a quarter of the corpus), not a missing value.
| Argument | Type | Description |
|---|---|---|
| q | string | Free text over title and full document text. |
| limit | integer | |
| offset | integer | |
| section | string | case_law, commentary or nkr. |
| year_to | integer | Latest period year, inclusive. |
| doc_kind | string | digest, review, generalization, nkr_opinion or publication. |
| year_from | integer | Earliest period year, inclusive. |
| court_body | string | vp_vs, kgs, kcs, kks, kas, echr or vs. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free text over title and full document text."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 200,
"minimum": 1
},
"offset": {
"type": "integer",
"default": 0,
"minimum": 0
},
"section": {
"type": "string",
"description": "case_law, commentary or nkr."
},
"year_to": {
"type": "integer",
"maximum": 2200,
"minimum": 1990,
"description": "Latest period year, inclusive."
},
"doc_kind": {
"type": "string",
"description": "digest, review, generalization, nkr_opinion or publication."
},
"year_from": {
"type": "integer",
"maximum": 2200,
"minimum": 1990,
"description": "Earliest period year, inclusive."
},
"court_body": {
"type": "string",
"description": "vp_vs, kgs, kcs, kks, kas, echr or vs."
}
}
}Search the UK Sanctions List (HM Treasury / FCDO consolidated financial sanctions designations) by name or alias. Returns matching designated parties with their aliases, regime, date of birth and nationality (for individuals), and the sanctions measures imposed. A `stale` flag is set when the underlying snapshot is older than the freshness window, and `retrieved` is false if no snapshot has ever been fetched yet.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Name, alias or exact ID number. |
| regime | string | Restrict to designations under this regime name. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 100,
"minimum": 1
},
"query": {
"type": "string",
"description": "Name, alias or exact ID number."
},
"regime": {
"type": "string",
"description": "Restrict to designations under this regime name."
}
}
}Search the UN Security Council Consolidated Sanctions List (individuals and entities) by name or alias. Returns matching listed records with their aliases, listing regime (`un_list_type`), and identifying details, plus a `stale` flag when the underlying snapshot is older than the freshness window and a `snapshot.retrieved` flag that is false if no snapshot has ever been obtained yet.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query* | string | Name, alias or exact ID number. |
| record_type | string | Restrict to 'individual' or 'entity'. |
| un_list_type | string | Restrict to a UN sanctions regime, e.g. 'DRC'. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1
},
"query": {
"type": "string",
"description": "Name, alias or exact ID number."
},
"record_type": {
"type": "string",
"description": "Restrict to 'individual' or 'entity'."
},
"un_list_type": {
"type": "string",
"description": "Restrict to a UN sanctions regime, e.g. 'DRC'."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 3, 2026.