# Leadgen ONRC Romania (remote · leadgen-mcp.adrianhomelab.com)

Romanian company data for agents: 4.2M ONRC firms, ANAF status, financials 2008–2025. Free key.

- Trust score: 67/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-22

> **Recent critical change**: Authorization (2026-10-20). See the changelog below before you install this server.

## Components

- remote · `leadgen-mcp.adrianhomelab.com`: 67/100 (this document), [markdown](https://verifymcp.io/servers/com-adrianhomelab-leadgen-onrc/leadgen-mcp-2.md), [page](https://verifymcp.io/servers/com-adrianhomelab-leadgen-onrc/leadgen-mcp-2)

## Channel facts

- Endpoint: `https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.3`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-22.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (unwatch).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4078 tokens (~239/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 17/100
  - Stability observed for 5 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 17 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Leadgen ONRC Romania MCP server?

Leadgen ONRC Romania is a hosted endpoint at https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-adrianhomelab-leadgen-onrc 'https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry'
```

### Cursor

```json
{
  "mcpServers": {
    "com-adrianhomelab-leadgen-onrc": {
      "url": "https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-adrianhomelab-leadgen-onrc": {
      "type": "http",
      "url": "https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-adrianhomelab-leadgen-onrc]
url = "https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-adrianhomelab-leadgen-onrc": {
      "type": "remote",
      "url": "https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-adrianhomelab-leadgen-onrc --url 'https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-adrianhomelab-leadgen-onrc:
    url: "https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry"
```

### Netclaw

```json
{
  "McpServers": {
    "com-adrianhomelab-leadgen-onrc": {
      "Transport": "http",
      "Url": "https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-adrianhomelab-leadgen-onrc -t streamable-http -u 'https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry'
```

### Other

```json
{
  "mcpServers": {
    "com-adrianhomelab-leadgen-onrc": {
      "type": "http",
      "url": "https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

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

### 2026-10-21 (score 67, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “get_usage” rewrote its description, which is the text the model reads

### 2026-10-20 (score 66, −7)

- [critical regression] Authorization: partial → fail
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “match_companies” rewrote its description, which is the text the model reads
- [security] Tool “lookup_financial_ratios” rewrote its description, which is the text the model reads
- [security] Tool “lookup_companies” rewrote its description, which is the text the model reads
- [security] Tool “report_issue” rewrote its description, which is the text the model reads
- [security] Tool “unwatch” is now declared destructive

### 2026-10-19 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-18 (score 72, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “find_company_by_domain” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 3657 → 4055
- [functional improvement] Stability: unverified → 0.03
- [functional] New tool “unwatch”
- [cosmetic] “lookup_by_category” added an optional parameter “sort”
- [cosmetic] “lookup_director” reworded the description of “compact”
- [cosmetic] “lookup_by_category” reworded the description of “main_activity_only”
- [cosmetic] “lookup_by_category” reworded the description of “county”
- [cosmetic] “lookup_by_category” reworded the description of “compact”
- [cosmetic] “lookup_business” reworded the description of “compact”
- [cosmetic] “find_company_by_domain” reworded the description of “compact”
- [cosmetic] “lookup_companies” reworded the description of “compact”
- [cosmetic] “match_companies” reworded the description of “compact”

### 2026-10-17 (score 72)

First indexed and scored.

## MCP tools (17)

### `lookup_business` (~305 tokens)

Look up a Romanian company

Look up a Romanian company by name or CUI (tax code) in the official ONRC registry of 4.2M firms. Diacritic-insensitive ('paval' finds 'PAVAL'); a CUI matches exactly. The first call for a named Romanian company. Ranked with a score: live firms first (exact name, then words), closed ones after; county lifts. For 'firms that do X in Y', use lookup_by_category (an empty result may carry a hint naming it).

Input parameters:

- `compact` (boolean): Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level and what it did not check, phone, website, latest revenue and headcount, record url).
- `county`: Optional county hint (diacritic-insensitive): firms registered there rank higher. Not a filter.
- `fields`: Optional: keep only these company fields in each row, comma-separated (companyName,cui,county,risk; dotted paths such as risk.level work). Without it the full record is returned.
- `max_results` (integer): Maximum number of companies to return (1-100, default 10).
- `query` (string, required): Company name or CUI (tax ID) to search for. Names are diacritic-insensitive ('paval' finds PAVĂL); a CUI ('2816464', 'RO2816464') matches exactly.

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `county` (string|null): The county hint, if one was given.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `fields` (array|null): The company fields kept when fields or compact trimmed the rows.
- `found` (boolean|null): false when a well-formed CUI is not in the snapshot.
- `hint` (object|null): When a name search finds nothing but reads like a category question: the lookup_by_category call that answers it.
- `message` (string|null): A sentence for the caller.
- `query` (string|null): The query as given.
- `reason` (string|null): Why nothing was found (not_found).
- `results` (array|null): The company records, best first.
- `returned` (integer|null): Rows in results. Every list answer carries it with this one meaning.
- `source` (string|null): Data source: onrc (registry) or mfp (Ministry of Finance filings).
- `total` (integer|null): Rows returned in this answer (at most max_results), not the number of firms that match; the same as returned (kept: the published v1 field).
- `warnings` (array|null): Notes on how the request was read (a clamped limit, a widened CAEN code, an ignored field).

### `lookup_companies` (~207 tokens)

Look up many companies by CUI

Look up many Romanian companies by CUI in one call (up to 100): one result per input, in input order, each with found true/false and the company record. Each row is one lookup; rows past today's allowance come back not_processed (partial: true, remaining: rows to resend after the reset). fields or compact trims each record.

Input parameters:

- `compact` (boolean): Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level and what it did not check, phone, website, latest revenue and headcount, record url).
- `cuis` (required): Up to 100 CUIs, as a list or one comma-separated string ('RO', spaces and leading zeros accepted, as in lookup_business).
- `fields`: Optional: keep only these company fields in each row, comma-separated (companyName,cui,county,risk; dotted paths such as risk.level work). Without it the full record is returned.

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `dailyLimit` (object|null): When partial: the daily-limit notice in the refusal vocabulary (error daily_limit_reached, message, limit, used, remaining allowance, resets_at, requested, processed, plan, get_a_key, pricing, docs,…
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `errors` (integer|null): Rows that are input errors (empty, not a CUI, wrong control digit).
- `fields` (array|null): The company fields kept when fields or compact trimmed the rows.
- `found` (integer|null): Rows that matched a firm.
- `message` (string|null): A sentence for the caller.
- `metering` (object|null): What the batch cost: rows, counted, notCounted (input-error rows and rows not processed are not counted), notProcessed (when partial) and the rule.
- `notFound` (integer|null): Well-formed CUIs not in the snapshot.
- `partial` (boolean|null): true when today's allowance ran out partway: the first processed rows were answered, the rest have status not_processed (not run, not counted).
- `processed` (integer|null): Rows answered, from the first one (input-error rows included).
- `remaining` (integer|null): Rows not processed (the last ones): send them again after the reset. 0 when the whole batch ran.
- `results` (array|null): Per input: input, cui, found, and company (the record) or error/reason; status not_processed for a row today's allowance did not cover.
- `source` (string|null): Data source: onrc (registry) or mfp (Ministry of Finance filings).
- `total` (integer|null): Number of input rows.
- `warnings` (array|null): Notes on how the request was read (a clamped limit, a widened CAEN code, an ignored field).

### `find_company_by_domain` (~222 tokens)

Find the company behind a website

Find the Romanian firm behind a website domain (dedeman.ro). Uses the registry's website field, else reads the site's home and legal/contact pages for the CUI or registration number it shows (matchedOn: registry_website, site_cui). Without one, it says so and offers name candidates from the page title or the domain name, each with a confidence (at most 0.7, never a match). One lookup.

Input parameters:

- `compact` (boolean): Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level and what it did not check, phone, website, latest revenue and headcount, record url).
- `domain` (string, required): The website's domain ('dedeman.ro'); a URL or a www. host is reduced to it. Public domains only.
- `fields`: Optional: keep only these company fields in each row, comma-separated (companyName,cui,county,risk; dotted paths such as risk.level work). Without it the full record is returned.

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `candidates` (array|null): When not found (also when the site cannot be read): up to 3 firms whose name matches the page title or the domain name, each with a confidence (at most 0.7).
- `domain` (string|null): The normalised domain.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `fields` (array|null): The company fields kept when fields or compact trimmed the rows.
- `found` (boolean|null): Whether a firm was identified.
- `match` (object|null): The identified firm: cui, companyName, matchedOn.
- `matchedOn` (string|null): registry_website, site_cui or site_registration_code.
- `message` (string|null): A sentence for the caller.
- `reason` (string|null): When not found: no_cui_on_site or site_unreachable.
- `results` (array|null): The company records, best first.
- `returned` (integer|null): Rows in results. Every list answer carries it with this one meaning.
- `site` (object|null): What was read from the site: url, pagesRead, title, cuis, registrationCodes, error.
- `total` (integer|null): Number of company records returned (at most 5); the same as returned.
- `warnings` (array|null): Notes on how the request was read (a clamped limit, a widened CAEN code, an ignored field).

### `match_companies` (~249 tokens)

Match a list of records to firms

Match a list of up to 500 records (name, optional county, domain or CUI) to Romanian firms: each row gets match {cui, companyName, confidence, matchedOn} and the record, or no_match with up to 3 candidates. A valid CUI wins (confidence 1.0). Each row is one lookup; rows past today's allowance come back not_processed (partial: true, remaining: rows to resend after the reset).

Input parameters:

- `compact` (boolean): Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level and what it did not check, phone, website, latest revenue and headcount, record url).
- `fields`: Optional: keep only these company fields in each row, comma-separated (companyName,cui,county,risk; dotted paths such as risk.level work). Without it the full record is returned.
- `rows` (array, required): Up to 500 records, each {name, county, domain, cui, ref} (any of them; ref is your own id, echoed back), or a bare string (a CUI, a domain or a name).

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `dailyLimit` (object|null): When partial: the daily-limit notice in the refusal vocabulary (error daily_limit_reached, message, limit, used, remaining allowance, resets_at, requested, processed, plan, get_a_key, pricing, docs,…
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `errors` (integer|null): Rows that are input errors (nothing to match on).
- `fields` (array|null): The company fields kept when fields or compact trimmed the rows.
- `matched` (integer|null): Rows matched to a firm.
- `message` (string|null): A sentence for the caller.
- `metering` (object|null): What the batch cost: rows, counted, notCounted (input-error rows and rows not processed are not counted), notProcessed (when partial) and the rule.
- `noMatch` (integer|null): Rows with no match above the threshold.
- `partial` (boolean|null): true when today's allowance ran out partway: the first processed rows were answered, the rest have status not_processed (not run, not counted).
- `processed` (integer|null): Rows answered, from the first one (input-error rows included).
- `remaining` (integer|null): Rows not processed (the last ones): send them again after the reset. 0 when the whole batch ran.
- `results` (array|null): Per row: row, input, status (matched or no_match), match {cui, companyName, confidence, matchedOn}, company, or candidates.
- `source` (string|null): Data source: onrc (registry) or mfp (Ministry of Finance filings).
- `threshold` (number|null): Confidence a row needs to be matched (0-1).
- `total` (integer|null): Number of input rows.
- `warnings` (array|null): Notes on how the request was read (a clamped limit, a widened CAEN code, an ignored field).

### `lookup_by_category` (~772 tokens)

Find companies by activity

Find companies by what they do, not by name: a curated topic ('software', 'retail'), plain words ('dentists', a CAEN class title; see matched) or CAEN codes ('4321,4322'; 6201 also finds Rev.3 6210). Narrow by county; qualify by revenue, headcount, VAT, main activity. active_only (default) drops dead and ANAF-inactive firms.

Input parameters:

- `active_only` (boolean): Default true: drop firms that are not a lead (struck off, dissolving, in liquidation, insolvent or bankrupt, activity suspended, or ANAF fiscally inactive). false returns every firm.
- `compact` (boolean): Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level and what it did not check, phone, website, latest revenue and headcount, record url).
- `county`: Optional county to narrow to (diacritic-insensitive: 'bucuresti', 'cluj'; a county town such as 'Cluj-Napoca' or a Bucharest sector is read as its county); omit for nationwide. An unknown county is a…
- `fields`: Optional: keep only these company fields in each row, comma-separated (companyName,cui,county,risk; dotted paths such as risk.level work). Without it the full record is returned.
- `has_website` (boolean): true keeps only firms with a website on file in the registry (default false).
- `legal_form`: Optional legal form(s) to keep, comma-separated, case-insensitive: 'SRL', 'SA', 'PFA', 'II', or 'SRL,SA' (companies, no sole traders). Default: any form.
- `main_activity_only` (boolean): Default false: a firm matches when the code is ANY of its authorised activities (ONRC lists a dozen per firm, most never practised). true keeps only firms whose DECLARED main activity is one of the c…
- `max_employees`: Optional maximum average headcount on the latest filing.
- `max_results` (integer): Maximum number of companies to return (1-100, default 10).
- `max_revenue`: Optional maximum net turnover in RON on the latest filing.
- `min_employees`: Optional minimum average headcount on the latest filing.
- `min_revenue`: Optional minimum net turnover in RON on the latest filing (FY2025, else FY2024). Firms without a filing never match a band.
- `sort` (string): Order of the results: 'newest' registrations first (default), 'revenue' (latest filing's turnover, biggest first) or 'employees' (headcount, biggest first); firms without a filing come last.
- `topic` (string, required): What the firms do: a curated topic ('software', 'retail'), plain words for a trade ('dentists', 'stomatologie'), a CAEN class title in Romanian or English, or CAEN codes ('6201' or '4321,4322'). Case…
- `vat_payer`: Optional: true keeps VAT-registered firms only, false only non-VAT payers (ANAF data). Omit for both.

Output parameters:

- `appUrl` (string|null): The same list opened in the Leadgen app (CAEN codes, county, legal form, active and main-activity filters), to share with the user; null when the app cannot open it (more than 10 codes, a legal form…
- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `availableTopicNames` (object|null): Each curated topic id with its name, e.g. {"agriculture": "Agriculture & Food"}, next to availableTopics.
- `availableTopics` (array|null): The curated topic ids, when the topic is unknown or ambiguous.
- `caenCodes` (array|null): The CAEN codes searched, when given or derived as codes.
- `caenNames` (array|null): The CAEN codes as asked, named: [{code, title (Romanian), titleEn}].
- `candidates` (array|null): When the words fit several activities (ambiguous_topic): the ones to choose from.
- `codesAdded` (array|null): CAEN Rev.2/Rev.3 counterparts added to the search.
- `county` (string|null): The county filter, if any.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `fields` (array|null): The company fields kept when fields or compact trimmed the rows.
- `filters` (object|null): The filters applied (legalForm, activeOnly, revenue and headcount bands, vatPayer, mainActivityOnly ...).
- `inactiveFilteredOut` (integer|null): Firms removed by active_only (null when off).
- `inactiveFilteredOutApproximate` (boolean|null): true when that count is estimated.
- `label` (string|null): Human label of what was matched.
- `matchTotal` (integer|null): How many firms the whole list holds with every filter (active_only on; null when off): exact, or estimated when matchTotalApproximate is true.
- `matchTotalApproximate` (boolean|null): true when matchTotal is estimated (matchTotalMargin: its 99% margin).
- `matchTotalMargin` (integer|null): The 99% margin of an estimated matchTotal.
- `matched` (object|null): How plain words were read: by, niche or class title, codes.
- `message` (string|null): A sentence for the caller.
- `query` (string|null): The topic as given.
- `results` (array|null): The company records, best first.
- `returned` (integer|null): Rows in results. Every list answer carries it with this one meaning.
- `sort` (string|null): The order of results: newest, revenue or employees.
- `source` (string|null): Data source: onrc (registry) or mfp (Ministry of Finance filings).
- `topic` (string|null): The curated topic matched, if any.
- `total` (integer|null): Rows returned in this answer (at most max_results), not the size of the match set: a full page (total == max_results) may have more; narrow the filters or raise max_results. The same as returned; the…
- `truncated` (boolean|null): true when max_results was cut to the list cap (and the list is full).
- `warningDetails` (array|null): The warnings that have a machine-readable form (the CAEN Rev.2/Rev.3 notes): [{code, params, message}], message the same English line as in warnings; null when none.
- `warnings` (array|null): Notes on how the request was read (a clamped limit, a widened CAEN code, an ignored field).

### `lookup_director` (~273 tokens)

Find companies by director

Find Romanian companies by the name of a director or legal representative (ONRC). Diacritic-insensitive. Whole words: 'pop maria' finds POP MARIA, not POPA MARIANA; prefix=true matches prefixes. The registry has no personal ID, so one name can be several people: homonyms and byCounty say so. Use this when you know a person rather than a firm.

Input parameters:

- `compact` (boolean): Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level and what it did not check, phone, website, latest revenue and headcount, record url).
- `fields`: Optional: keep only these company fields in each row, comma-separated (companyName,cui,county,risk; dotted paths such as risk.level work). Without it the full record is returned.
- `max_results` (integer): Maximum number of companies to return (1-100, default 10).
- `name` (string, required): Director / representative name to search for (e.g. 'Ion Popescu'); diacritic-insensitive, each word a whole word of the name.
- `prefix` (boolean): true matches each word as a prefix ('pop' also finds POPA, POPESCU); default false (whole words).

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `byCounty` (object|null): Matching firms per county.
- `distinctCounties` (integer|null): Number of counties the matches are in.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `fields` (array|null): The company fields kept when fields or compact trimmed the rows.
- `homonyms` (boolean|null): true when the matches span several counties (likely several people).
- `match` (string|null): words (whole words) or prefix.
- `message` (string|null): A sentence for the caller.
- `note` (string|null): What homonyms means for this name.
- `query` (string|null): The name as given.
- `results` (array|null): The company records, best first.
- `returned` (integer|null): Rows in results. Every list answer carries it with this one meaning.
- `source` (string|null): Data source: onrc (registry) or mfp (Ministry of Finance filings).
- `total` (integer|null): Every matching firm, not just the rows returned.
- `totalIsLowerBound` (boolean|null): true when the scan stopped early and total is a minimum.
- `warnings` (array|null): Notes on how the request was read (a clamped limit, a widened CAEN code, an ignored field).

### `extract_contacts` (~97 tokens)

Extract contacts from a website

Crawl a company website and extract emails, phone numbers and social profiles. Accepts a bare domain or a full URL; max_pages (1-20, default 5) bounds the crawl.

Input parameters:

- `max_pages` (integer): Maximum number of pages to crawl (1-20, default 5).
- `website` (string, required): The website to crawl: a bare domain ('example.com') or a full URL ('https://example.com').

Output parameters:

- `domain` (string|null): The site's registrable domain.
- `emails` (array|null): Addresses on the site's own domain.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `facebook` (string|null): Facebook profile.
- `github` (string|null): GitHub profile.
- `instagram` (string|null): Instagram profile.
- `linkedin` (string|null): LinkedIn page.
- `message` (string|null): A sentence for the caller.
- `otherEmails` (array|null): Other addresses found on the site.
- `pagesCrawled` (integer|null): Pages read.
- `personalEmails` (array|null): Addresses shaped like a person's (firstname.lastname@): personal data, so GDPR art. 14 and Law 506/2004 apply. Role addresses (office@) rank first.
- `phones` (array|null): Phone numbers found.
- `socialLinks` (array|null): Every social link found, best first.
- `twitter` (string|null): X / Twitter profile.
- `url` (string|null): The start URL crawled.
- `youtube` (string|null): YouTube channel.

### `enrich_company` (~199 tokens)

Company profile with website contacts

A whole-firm profile in one call: the ONRC registry record plus the contacts discovered on that firm's website, each labelled with a confidence and a source. Prefer this over lookup_business followed by extract_contacts when you want everything about one company. cui is its tax code; website overrides the registered one; max_pages bounds the crawl; refresh=true crawls now instead of answering from the cache.

Input parameters:

- `cui` (string, required): Romanian tax identification number (CUI), e.g. '2816464'; 'RO' and leading zeros are accepted.
- `max_pages` (integer): Maximum number of pages to crawl (1-20, default 5).
- `refresh` (boolean): true crawls now even if a cached result exists (default false: answer from the cache when there is one).
- `website`: Optional website override (domain or URL). When omitted, the firm's registered website is used (an error if none is on file).

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `cacheHit` (boolean|null): true when answered from the cache.
- `company` (object): A company record: companyName, cui, registrationCode, registrationDate (DD/MM/YYYY), legalForm, euid, address (a sole trader's PFA/II/IF locality only in an answer listing several firms, with address…
- `contacts` (array|null): Contacts found, each with type, value, confidence and source; an email also has personal (true for a firstname.lastname@ address: GDPR art. 14 and Law 506/2004 apply), role addresses first.
- `crawlError` (string|null): Why the crawl failed, if it did.
- `crawled` (boolean|null): true when the site was crawled for this answer.
- `cui` (string|null): The firm's CUI.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `message` (string|null): A sentence for the caller.
- `pagesCrawled` (integer|null): Pages read.
- `website` (string|null): The website crawled.
- `websiteSource` (string|null): Where the website came from: registry or override.

### `lookup_domain` (~134 tokens)

Domain WHOIS, DNS and email audit

WHOIS plus DNS records (A, MX, NS, TXT) and an SPF/DMARC email-security audit for a domain. Use it to profile a company's web estate or check its email posture. include_dns and include_security toggle the two halves.

Input parameters:

- `domain` (string, required): Domain name to look up (e.g. 'example.com'); a URL is reduced to its host.
- `include_dns` (boolean): Include DNS records (A, AAAA, MX, NS, TXT, SOA); default true.
- `include_security` (boolean): Include the SPF/DMARC email-security check; default true.

Output parameters:

- `dns` (object|null): Records by type: A, AAAA, MX, NS, TXT, SOA.
- `domain` (string|null): The normalised domain.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `message` (string|null): A sentence for the caller.
- `resolvedIP` (string|null): An address the domain resolves to.
- `security` (object|null): hasSPF, spf, hasDMARC, dmarc.
- `whois` (object|null): registrar, creationDate, expirationDate, updatedDate, nameServers, registrantOrg, registrantCountry.

### `lookup_financials` (~123 tokens)

Annual financial statements

Annual financial statements for a Romanian company from Ministry of Finance filings, every fiscal year on record since 2008: revenue, profit, headcount and balance-sheet lines in RON with each year's ratios (growth, margins, equity ratio, liquidity), plus a summary (3/5/10-year CAGR, loss years, health score). Resolve the firm with lookup_business first if you only have a name.

Input parameters:

- `cui` (string, required): Romanian tax identification number (CUI), e.g. '2816464'; 'RO' and leading zeros are accepted.

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `cui` (string|null): The firm's CUI.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `found` (boolean|null): Whether any filing is on record.
- `message` (string|null): A sentence for the caller.
- `source` (string|null): Data source: onrc (registry) or mfp (Ministry of Finance filings).
- `summary` (object|null): History, revenue growth (3/5/10-year CAGR), latest ratios, health score and band, flags.
- `total` (integer|null): Number of fiscal years returned.
- `years` (array|null): Per fiscal year: revenue, profit, loss, netResult, employees, assets, debt, equity (RON) and that year's ratios.

### `lookup_financial_ratios` (~131 tokens)

Financial ratios and health score

Financial analysis of a Romanian company: multi-year revenue trend (YoY, 3/5/10-year CAGR), margins, headcount, solvency and liquidity ratios, a 0–100 health score with its rule-by-rule breakdown, red flags, and peer percentiles within the same CAEN activity and county. Verdict: 'growing', 'stable' or 'distressed'. Use lookup_financials for the raw figures.

Input parameters:

- `cui` (string, required): Romanian tax identification number (CUI), e.g. '2816464'; 'RO' and leading zeros are accepted.

Output parameters:

- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `cui` (string|null): The firm's CUI.
- `distress` (boolean|null): true when the distress signals fire.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `flags` (array|null): Red flags.
- `found` (boolean|null): Whether any filing is on record.
- `headcount` (object|null): Latest headcount and its change.
- `healthScore` (object|null): 0-100 score, band and its rule-by-rule components.
- `history` (object|null): Years on record, loss years, revenue peak.
- `message` (string|null): A sentence for the caller.
- `peers` (object|null): Percentiles within the same CAEN activity and county.
- `ratios` (object|null): Margins, equity ratio, debt to equity, liquidity, returns.
- `revenueTrend` (object|null): Latest revenue, YoY growth, 3/5/10-year CAGR, trend label.
- `signals` (array|null): The distress signals found.
- `source` (string|null): Data source: onrc (registry) or mfp (Ministry of Finance filings).
- `total` (integer|null): Number of fiscal years used.
- `verdict` (string|null): growing, stable or distressed.
- `years` (array|null): Per fiscal year figures and margins.

### `watch_company` (~111 tokens)

Watch a company for changes

Register a company (by CUI) to monitor. Stores a fingerprint of its current registry record as the baseline; poll_watchlist then reports changes between monthly ONRC snapshots - a new director, a new CAEN activity, an address or status change - and when ANAF declares it fiscally inactive or its VAT status flips.

Input parameters:

- `cui` (string, required): Romanian tax identification number (CUI) of the firm to watch, e.g. '2816464'. Watching a firm you already watch changes nothing.

Output parameters:

- `alreadyWatching` (boolean|null): true when you already held this watch (nothing changed).
- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `message` (string|null): A sentence for the caller.
- `ok` (boolean|null): true when the watch is in place.
- `watch` (object|null): kind, target, owner (key prefix), county, baseline.

### `watch_caen` (~143 tokens)

Watch an activity for new firms

Watch a CAEN activity code, optionally scoped to one county, for newly registered firms. A registration-date cutoff is the baseline: only firms registered after it are reported, and poll_watchlist slides the cutoff forward so each new firm surfaces once. A retired CAEN Rev.2 code (6201) also watches its Rev.3 successor (6210), with a warning.

Input parameters:

- `code` (string, required): CAEN activity code to watch (e.g. '6210'); a retired Rev.2 code also watches its Rev.3 successor.
- `county`: Optional county name to scope the watch to (diacritic-insensitive); omit to watch nationwide.

Output parameters:

- `alreadyWatching` (boolean|null): true when you already held this watch (nothing changed).
- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `message` (string|null): A sentence for the caller.
- `ok` (boolean|null): true when the watch is in place.
- `warnings` (array|null): Notes on how the request was read (a clamped limit, a widened CAEN code, an ignored field).
- `watch` (object|null): kind, target, owner (key prefix), county, baseline.

### `poll_watchlist` (~77 tokens)

Collect watchlist changes

Collect everything the watch tools have found: call it to drain the changeset for every watch owned by your API key, most severe first. Company watches return an 'updated' entry with the changed fields and risk; CAEN and county watches return the 'new' firms registered since the last poll (200 a poll, the rest next).

Output parameters:

- `active` (array|null): Every watch you hold, changed or not: kind (company or caen), target (CUI or code), county, since, name. Remove one with unwatch.
- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `email_alerts` (string|null): How to get the same changes by email.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `message` (string|null): A sentence for the caller.
- `ok` (boolean|null): true when the poll ran.
- `owner` (string|null): Whose watches these are (key prefix or IP).
- `total` (integer|null): Number of watches with news.
- `watches` (array|null): Per watch: an 'updated' company with its changed fields and risk, or the 'new' firms registered in a watched activity.

### `unwatch` (~147 tokens)

Stop watching a company or activity

Stop watching a company (cui) or a CAEN activity code (code, plus the county it was watched in, if any), on your API key: the watch and its baseline are removed. Unwatching something you do not watch changes nothing (removed: 0). poll_watchlist lists your active watches.

Input parameters:

- `code`: A watched CAEN activity code (e.g. '6210'); give this or cui.
- `county`: With code: the county the code was watched in (diacritic-insensitive); omit for a nationwide watch.
- `cui`: CUI of a watched firm (e.g. '2816464'); give this or code.

Output parameters:

- `active` (array|null): The watches you still hold (as in poll_watchlist).
- `asOf` (object|null): What to cite: registry (ONRC snapshot date), financialYear (fiscal year of the figures), anaf (day of the ANAF data), snapshot, published, source.
- `attribution` (string|null): The credit line to keep when redistributing the data (CC BY 4.0).
- `county` (string|null): The CAEN watch's county; null for nationwide or a company.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `kind` (string|null): company or caen.
- `message` (string|null): A sentence for the caller.
- `ok` (boolean|null): true when the request was valid.
- `owner` (string|null): Whose watches these are (key prefix or IP).
- `removed` (integer|null): 1 when the watch was removed, 0 when you did not hold it.
- `target` (string|null): The CUI or CAEN code.

### `get_usage` (~86 tokens)

Show my daily allowance

Show your own allowance: plan, daily limit, lookups used today, how many remain, when it resets (00:00 UTC) and any credit balance. Free and never counted as a lookup. Limits: 30 anonymous MCP calls a day, 50 with a free API key from https://leadgen.adrianhomelab.com/start (an email address, no payment).

Output parameters:

- `counted` (boolean|null): Always false: this call is not counted.
- `daily_limit` (integer|null): Lookups allowed per UTC day.
- `entitlements` (object|null): What the plan includes.
- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `identity` (object|null): Who is counted: kind (key or anonymous) and counted_as.
- `links` (object|null): get_a_key, pricing, docs.
- `message` (string|null): A sentence for the caller.
- `plan` (string|null): Plan name (free, pro, business).
- `remaining` (integer|null): Lookups left today.
- `resets_at` (string|null): When the allowance resets (ISO 8601, 00:00 UTC).
- `resets_in_seconds` (integer|null): Seconds until the reset.
- `suspended` (boolean|null): true when the key is suspended.
- `used_today` (integer|null): Lookups used today.

### `report_issue` (~193 tokens)

Report missing or wrong data

Report to the person who runs Leadgen what is missing or wrong: a missing field, firm or source (kind 'gap'), a wrong company record ('wrong_record', pass its cui), a bug, an idea. Free, never counted as a lookup. contact is optional (an address for a reply); nothing is mailed to it automatically. Registry records are corrected at the source (ONRC) and arrive with the next snapshot.

Input parameters:

- `contact`: Optional email address for a reply; nothing is mailed to it automatically.
- `cui`: Optional CUI of the firm the report is about (for 'wrong_record').
- `kind` (string): One of 'gap' (a missing field, firm or source; the default), 'wrong_record' (pass its cui), 'bug', 'idea', 'other'.
- `message` (string, required): The report, in plain words: what is missing or wrong.

Output parameters:

- `error` (string|null): Set only when there is no answer (empty_query, invalid_cui, data_unavailable, plan_required ...); such a call is not counted.
- `id` (integer|null): The report's id.
- `kind` (string|null): The kind filed.
- `message` (string|null): A sentence for the caller.
- `note` (string|null): For wrong_record: how registry records get corrected.
- `status` (string|null): received.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-adrianhomelab-leadgen-onrc/leadgen-mcp-2#diagnostics

## Score history

- 2026-10-22: 67
- 2026-10-21: 67
- 2026-10-20: 66
- 2026-10-19: 73
- 2026-10-18: 72
- 2026-10-17: 72

## Common questions

### What is the Leadgen ONRC Romania MCP server?

Leadgen ONRC Romania is an MCP server listed in the public MCP registry as com.adrianhomelab/leadgen-onrc. Romanian company data for agents: 4.2M ONRC firms, ANAF status, financials 2008–2025. Free key. This page covers its hosted endpoint (https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry).

### Is the Leadgen ONRC Romania MCP server safe to use?

Leadgen ONRC Romania scores 67 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Leadgen ONRC Romania MCP server expose?

Leadgen ONRC Romania exposes 17 tools: lookup_business, lookup_companies, find_company_by_domain, match_companies, lookup_by_category, and 12 more. Their descriptions and schemas cost roughly 3,469 tokens of context every time the server is loaded.

### Does the Leadgen ONRC Romania MCP server require authentication?

No. We connected to Leadgen ONRC Romania without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Leadgen ONRC Romania MCP server still maintained?

Leadgen ONRC Romania is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://leadgen-mcp.adrianhomelab.com/mcp?src=mcp-registry
- Repository: https://github.com/darksider4all/leadgen-mcp
- Website: https://leadgen.adrianhomelab.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-adrianhomelab-leadgen-onrc/leadgen-mcp-2.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-adrianhomelab-leadgen-onrc/leadgen-mcp-2.json
- HTML version of this page: https://verifymcp.io/servers/com-adrianhomelab-leadgen-onrc/leadgen-mcp-2
