{"name": "leadgen-mcp", "displayName": "Leadgen MCP - Romanian Business Data (ONRC)", "description": "Romanian business registry lookup (4.2M firms) + director search, financial statements, website contact extraction, domain/SPF-DMARC audit, and company / CAEN activity monitoring. Official ONRC open data. Free tier.", "serverInfo": {"name": "leadgen", "version": "1.0.0", "title": "Leadgen MCP - Romanian Business Data (ONRC)", "tools": [{"name": "lookup_business", "description": "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).", "inputSchema": {"properties": {"query": {"title": "Query", "type": "string"}, "max_results": {"default": 10, "title": "Max Results", "type": "integer"}, "county": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "County"}, "fields": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "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.", "title": "Fields"}, "compact": {"default": false, "description": "Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level, phone, website, latest revenue and headcount).", "title": "Compact", "type": "boolean"}}, "required": ["query"], "title": "lookup_businessArguments", "type": "object"}}, {"name": "lookup_companies", "description": "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 counts as one lookup; a batch larger than what is left today is refused whole. fields or compact trims each record.", "inputSchema": {"properties": {"cuis": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "string"}], "title": "Cuis"}, "fields": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "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.", "title": "Fields"}, "compact": {"default": false, "description": "Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level, phone, website, latest revenue and headcount).", "title": "Compact", "type": "boolean"}}, "required": ["cuis"], "title": "lookup_companiesArguments", "type": "object"}}, {"name": "find_company_by_domain", "description": "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. One lookup.", "inputSchema": {"properties": {"domain": {"title": "Domain", "type": "string"}, "fields": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "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.", "title": "Fields"}, "compact": {"default": false, "description": "Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level, phone, website, latest revenue and headcount).", "title": "Compact", "type": "boolean"}}, "required": ["domain"], "title": "find_company_by_domainArguments", "type": "object"}}, {"name": "match_companies", "description": "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 counts as one lookup; a batch larger than what is left today is refused whole.", "inputSchema": {"$defs": {"MatchRow": {"description": "One record to match: any of name, county, domain, cui; ref (your own id) is echoed back.", "properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Name"}, "county": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "County"}, "domain": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Domain"}, "cui": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Cui"}, "ref": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Ref"}}, "title": "MatchRow", "type": "object"}}, "properties": {"rows": {"items": {"anyOf": [{"$ref": "#/$defs/MatchRow"}, {"type": "string"}]}, "title": "Rows", "type": "array"}, "fields": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "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.", "title": "Fields"}, "compact": {"default": false, "description": "Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level, phone, website, latest revenue and headcount).", "title": "Compact", "type": "boolean"}}, "required": ["rows"], "title": "match_companiesArguments", "type": "object"}}, {"name": "lookup_by_category", "description": "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.", "inputSchema": {"properties": {"topic": {"title": "Topic", "type": "string"}, "county": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "County"}, "max_results": {"default": 10, "title": "Max Results", "type": "integer"}, "legal_form": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Legal Form"}, "active_only": {"default": true, "title": "Active Only", "type": "boolean"}, "has_website": {"default": false, "title": "Has Website", "type": "boolean"}, "min_revenue": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min Revenue"}, "max_revenue": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max Revenue"}, "min_employees": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min Employees"}, "max_employees": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max Employees"}, "vat_payer": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "title": "Vat Payer"}, "main_activity_only": {"default": false, "title": "Main Activity Only", "type": "boolean"}, "fields": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "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.", "title": "Fields"}, "compact": {"default": false, "description": "Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level, phone, website, latest revenue and headcount).", "title": "Compact", "type": "boolean"}}, "required": ["topic"], "title": "lookup_by_categoryArguments", "type": "object"}}, {"name": "lookup_director", "description": "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.", "inputSchema": {"properties": {"name": {"title": "Name", "type": "string"}, "max_results": {"default": 10, "title": "Max Results", "type": "integer"}, "prefix": {"default": false, "title": "Prefix", "type": "boolean"}, "fields": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "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.", "title": "Fields"}, "compact": {"default": false, "description": "Optional: true keeps a short preset per row (name, CUI, county, city, legal form, risk level, phone, website, latest revenue and headcount).", "title": "Compact", "type": "boolean"}}, "required": ["name"], "title": "lookup_directorArguments", "type": "object"}}, {"name": "extract_contacts", "description": "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.", "inputSchema": {"properties": {"website": {"title": "Website", "type": "string"}, "max_pages": {"default": 5, "title": "Max Pages", "type": "integer"}}, "required": ["website"], "title": "extract_contactsArguments", "type": "object"}}, {"name": "enrich_company", "description": "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.", "inputSchema": {"properties": {"cui": {"title": "Cui", "type": "string"}, "website": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Website"}, "max_pages": {"default": 5, "title": "Max Pages", "type": "integer"}, "refresh": {"default": false, "title": "Refresh", "type": "boolean"}}, "required": ["cui"], "title": "enrich_companyArguments", "type": "object"}}, {"name": "lookup_domain", "description": "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.", "inputSchema": {"properties": {"domain": {"title": "Domain", "type": "string"}, "include_dns": {"default": true, "title": "Include Dns", "type": "boolean"}, "include_security": {"default": true, "title": "Include Security", "type": "boolean"}}, "required": ["domain"], "title": "lookup_domainArguments", "type": "object"}}, {"name": "lookup_financials", "description": "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.", "inputSchema": {"properties": {"cui": {"title": "Cui", "type": "string"}}, "required": ["cui"], "title": "lookup_financialsArguments", "type": "object"}}, {"name": "lookup_financial_ratios", "description": "Derived financial intelligence for 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.", "inputSchema": {"properties": {"cui": {"title": "Cui", "type": "string"}}, "required": ["cui"], "title": "lookup_financial_ratiosArguments", "type": "object"}}, {"name": "watch_company", "description": "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.", "inputSchema": {"properties": {"cui": {"title": "Cui", "type": "string"}}, "required": ["cui"], "title": "watch_companyArguments", "type": "object"}}, {"name": "watch_caen", "description": "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.", "inputSchema": {"properties": {"code": {"title": "Code", "type": "string"}, "county": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "County"}}, "required": ["code"], "title": "watch_caenArguments", "type": "object"}}, {"name": "poll_watchlist", "description": "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).", "inputSchema": {"properties": {}, "title": "poll_watchlistArguments", "type": "object"}}, {"name": "get_usage", "description": "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: 5 lookups a day anonymously, 25 with a free API key from https://leadgen.adrianhomelab.com/start (an email address, no payment).", "inputSchema": {"properties": {}, "title": "get_usageArguments", "type": "object"}}, {"name": "report_issue", "description": "Tell the Leadgen founder 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.", "inputSchema": {"properties": {"message": {"title": "Message", "type": "string"}, "kind": {"default": "gap", "title": "Kind", "type": "string"}, "cui": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Cui"}, "contact": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Contact"}}, "required": ["message"], "title": "report_issueArguments", "type": "object"}}]}, "homepage": "https://leadgen.adrianhomelab.com/", "transport": {"type": "streamable-http", "url": "https://leadgen-mcp.adrianhomelab.com/mcp"}, "registration_url": "https://leadgen.adrianhomelab.com/start", "keywords": ["romania", "onrc", "business-registry", "lead-generation", "cui", "caen", "whois", "dns"]}