Merit — Ukrainian Law & Registers

legal.meritPublished by merit.legalOfficial publisherv1.0.4Updated Nov 7, 2026

50+ Ukrainian legal sources, 120+ tools: laws on any date, case law, courts, companies, sanctions.

VerifiedStreamable HTTPWeb executableFinanceKnowledge & MemoryBusiness & Commerce

Overview

AI-generated overview

Remote, read-only MCP server giving an assistant searchable access to Ukrainian legislation, case law, court and public registers, and sanctions lists.

What you can do
  • Search and read Ukrainian legislation: acts, provisions by text, tables of contents, unit text, editions and in-force status on a given date
  • Search court decisions, court practice on an article, case lookup, hearings, Supreme Court positions and digests, and ECHR cases against Ukraine
  • Look up companies and sole proprietors, debtors, enforcement proceedings, bankruptcy announcements and the corruption register
  • Search EU, US OFAC, UK and UN sanctions lists by name or alias
  • Retrieve legal indicators, NBU exchange rates, consumer price index figures, court fees and holiday checks
  • Find further sources through catalogue tools that describe and call tools not listed directly
When to use it
Useful for legal, compliance, due-diligence and research work involving Ukrainian law or Ukrainian counterparties, where answers should cite the source and its date instead of relying on model memory. Also handy for sanctions screening and for date-specific questions such as which version of an article applied or what a court fee amounts to.
Requirements
A remote Streamable HTTP endpoint; no local package. A Merit account is required and sign-in happens through OAuth 2.1 on the first call. Network access to the hosted service. Paid plans apply after a trial week.
Before you install
Read-only: no tool changes or sends anything, and the service states it does not see the chat, only the request sent to a source. Empty results never prove a person, company or proceeding does not exist, and sanctions lists are split by authority, so a miss on one list says nothing about others. Usage is billed per successful tool call after a paid trial, so costs depend on how many calls the assistant makes.

Installation

In SourceWeft

  1. Open Merit — Ukrainian Law & Registers in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/legal.merit%2Flaw/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "merit-ukrainian-law-registers": {
      "type": "http",
      "url": "https://law.merit.legal/mcp"
    }
  }
}

README

Merit — Ukrainian Law & Registers (MCP server)

A remote Model Context Protocol server that gives an AI assistant read-only access to Ukrainian law and public registers: legislation in its version on any date, Supreme Court practice, court hearings, the company register, professional registers, enforcement proceedings, debtors and five sanctions lists.

  • Endpoint: https://law.merit.legal/mcp (Streamable HTTP)
  • Registry name: legal.merit/law
  • Authentication: OAuth 2.1 — the client opens the Merit sign-in page, you sign in with your email
  • Website, pricing and help: https://merit.legal/en/mcp

This repository holds documentation only. The server is a hosted service; its source code is not public.

What it does

The assistant calls the server instead of answering from memory. It searches the official sources, reads the right article or record and answers with the source and its date.

  • Read only. No tool changes or sends anything.
  • It does not see your chat. The assistant sends only the request to a source (a case number, an article, a company code).
  • Stateless. Each request stands alone.

Sources

50+ sources and 120+ tools. Each source is a set of tools named source__action (for example ua_law__get_unit_in_force). The assistant sees the main tools at once and finds the others through the server's catalogue tools (catalog__search, catalog__describe, catalog__call).

GroupSources
Legislationua_law (Verkhovna Rada acts, editions on any date, comparison of editions, draft laws), ua_npa_registry, ua_ccu, ua_dstu, ua_war_territories
Case lawua_edrsr (Unified State Register of Court Decisions), ua_lpd (Supreme Court legal positions), ua_vs_digest, ua_echr
Courtsua_court_directory, ua_court_hearings, ua_court_transfer
Companies and public dataua_edr_companies (companies and sole proprietors), ua_nazk_declarations, ua_corruption_registry, ua_licenses, ua_media_registry, prozorro, ua_construction, ua_ip
Taxua_tax_registers, ua_zir
Foreign companiesgleif, uk_companies_house, icij_offshore_leaks
Person checksua_wanted_persons, ua_lustration, ua_lost_documents
Professional registersua_advocates, ua_notaries, ua_experts, ua_expert_methodics, ua_trustees, ua_auditors, ua_appraisers
Debts, enforcement, bankruptcyua_enforcement_proceedings, ua_debtors, ua_bankruptcy
Sanctionsua_sanctions, eu_sanctions, ofac_sanctions, uk_sanctions, un_sanctions
Regulatorsua_amcu_decisions, ua_amcu_offenders, ua_nbu_bank_directory, ua_nbu_financial_institutions, ua_nbu_currency_exchange
Calculations and calendarua_nbu_rate, ua_cpi_inflation, ua_legal_indicators (court fee, subsistence minimum, NBU rate), ua_holidays, ua_gp_crime_stats

Honest answers

Every source follows the same rules:

  • as_of is the publication date of the source itself, not the date of our sync. An outdated snapshot carries stale.
  • available: false with a reason means the source could not answer. It is not an empty result.
  • An empty result never means that the person, company or proceeding does not exist.
  • A shortened field always carries a flag or a character count.
  • Sanctions are split by authority. A "no" from one list says nothing about the others.

Configuration

You need a Merit account: https://merit.legal/en/mcp. On the first call the client opens the sign-in page.

VS Code (GitHub Copilot)

Add to .vscode/mcp.json or to your user MCP configuration:

json
{  "servers": {    "merit": {      "type": "http",      "url": "https://law.merit.legal/mcp"    }  }}

Cursor and other clients with mcpServers

json
{  "mcpServers": {    "merit": {      "url": "https://law.merit.legal/mcp"    }  }}

Claude, ChatGPT, Gemini

  • Claude (claude.ai, Desktop, mobile): Customize → Connectors → find Merit, or add a custom connector with https://law.merit.legal/mcp.
  • ChatGPT: find Merit under Plugins, or add a custom MCP server with the same address.
  • Gemini: add a custom app with the same address in the connected apps settings.

Usage

Ask a legal question in plain language, in Ukrainian or English. The assistant picks the tools.

AskTools the assistant uses
Which version of Art. 625 of the Civil Code was in force on 15 March 2022, and what has changed since?ua_law__get_unit_in_force, ua_law__compare_unit_editions
Find Supreme Court positions on 3% per annum and inflation losses under martial law.ua_lpd__search, ua_vs_digest__search, ua_edrsr__search
Check a counterparty by its EDRPOU code: status, director, enforcement proceedings, sanctions.ua_edr_companies__lookup, ua_enforcement_proceedings__search, ua_debtors__search, ua_sanctions__search, eu_sanctions__search
Calculate inflation losses on a debt of 120,000 UAH from February 2024 to September 2026.ua_cpi_inflation__lookup, ua_law__get_unit_in_force
When is the next hearing in my case, and has its jurisdiction changed?ua_court_hearings__search, ua_court_transfer__search, ua_court_directory__lookup
Is the certificate of the other side's advocate valid?ua_advocates__search, ua_advocates__get_advocate

The server gives the assistant sources with links and dates. The conclusion and the responsibility stay with the lawyer.

Plans

A trial week costs 1 UAH. Paid plans start at 790 UAH per 4 weeks. A call is one successful tool call. Details: https://merit.legal/en/mcp#pricing.

Support

Source: README.md at commit 5442d30

Tools

43

ua_law__search_units

Search Legislation Provisions by Text

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.

Parametersnregtextrequiredlimitoffseton_dateper_actamending_acts

ua_law__get_document

Get Legal Act Card

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.

Parametersnregrequiredoffsetrelation

ua_law__get_unit

Get Legal Provision Metadata

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.

Parametersurnrequired

ua_law__get_unit_in_force

Check Provision In Force on Date

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

Parametersurnrequireddaterequired

ua_law__get_unit_fulltext

Get Legal Provision Text

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

Parametersurnrequiredcursormax_charsparts_offset

ua_law__get_units_fulltext

Get Several Legal Provisions' Text

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.

Parametersurnsrequiredmax_chars

ua_law__get_unit_editions

List Provision Editions

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.

Parametersurnrequiredlimitto_datefrom_date

ua_law__get_document_toc

Get Legal Act Contents

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.

Parameterskindnregrequiredlimitnumberoffsetedition_date

ua_edrsr__get_document

Get Court Decision (EDRSR)

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.

Parametersdoc_idrequiredoffsetsectionmax_charsinclude_html

ua_edrsr__get_court_practice

Court Practice on a Statute Article

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.

Parameterslimitfacet_sizeabbreviationrequiredarticle_numberrequiredclause_component

ua_edrsr__lookup_case

Look Up Court Case (EDRSR)

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.

Parametersdoc_idoffsetcause_nummax_charsmatch_limitrelated_limit

ua_bankruptcy__get_case

Get Bankruptcy Case

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.

Parameterslimitcase_numberrequired

ua_debtors__lookup

Look Up Debtors by Proceeding

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.

Parametersproceeding_numberrequired

ua_edr_companies__lookup

Look Up Company (EDR)

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.

Parametersedrpourecordhistoryon_date

ua_edr_companies__search_fop

Search Sole Traders (EDR)

ФОП (фізичні особи-підприємці) 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.

Parametersqlimitoffsetstatusregistered_toterminated_toregistered_fromterminated_from

ua_edr_companies__lookup_fop

Look Up Sole Trader (EDR)

One ФОП by `record`: termination entry and reason, annulled termination, farm-household flag, property manager, tax/ЄСВ registration.

Parametersrecordrequiredhistory

ua_enforcement_proceedings__lookup

Look Up Enforcement Proceeding

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.

Parametersvp_numrequired

ua_echr__get_case

Get ECHR Document (HUDOC)

One HUDOC document by `itemid`, adding cited Strasbourg case law, domestic law at issue, judges.

Parametersitemidrequired

ua_nbu_rate__rate

Get NBU Exchange Rate

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.

Parametersdatecurrencyrequired

ua_vs_digest__document

Get Supreme Court Practice Review

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.

Parameterstext_limittext_querydocument_idrequiredtext_offset

ua_holidays__check_date

Check Ukrainian Holiday

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.

Parametersdaterequired

ua_lpd__position

Get Supreme Court Legal Position

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.

Parametersposition_idrequired

catalog__describe

Describe Catalog Tool

A catalog tool's full description and input schema, as tools/list would publish it.

Parameterstoolrequired

catalog__call

Call Catalog Tool

Run a catalog tool with its arguments. It is validated, limited, billed and answered exactly as a listed tool would be.

Parameterstoolrequiredarguments

Version history

3
  1. v1.0.4LatestNov 7, 2026
  2. v1.0.3Nov 3, 2026
  3. v1.0.2Nov 3, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.