Back to MCP Servers

Openregistry

Live official data from 27 national company registries (UK Companies House, France RNE, Germany Handelsregister, Korea OpenDART, Canada CBCA, 10 US states, and more) for KYC / AML / due-diligence workflows. Raw official records, no intermediaries. A platform by sophymarine. Host…

finance-fintech
By sophymarine
112Updated 1 month agoJavaScriptApache-2.0

Installation

npx -y openregistry

Configuration

{
  "mcpServers": {
    "openregistry": {
      "command": "npx",
      "args": ["-y", "openregistry"]
    }
  }
}

How to use

  1. Run the installation command above (if needed)
  2. Open your Claude Code settings file (~/.claude/settings.json)
  3. Add the configuration to the mcpServers section
  4. Restart Claude Code to apply changes

OpenRegistry

Official MCP Registry Glama Score Cursor Directory PulseMCP Smithery Follow @sophymarine on X License: Apache 2.0

Real-time direct access to unmodified data and raw filings of 30 official government registries via MCP.

Tools: search companies, get profiles, officers, shareholders, charges, filings, and financial-statement documents.

Covers UK Companies House, Ireland CRO, France RNE, Spain BORME, Italy InfoCamere, Norway Brreg, Poland KRS, Netherlands KVK, Belgium KBO, Switzerland Zefix, Finland, Czechia, Korea, Taiwan, New Zealand, Cayman Island, Australia, Canada and a lot more.

Free tier; paid keys for higher quota and depth.

Data licensed from 🇬🇧 UK Companies House · 🇮🇪 CRO Ireland · 🇳🇴 Brønnøysund · 🇨🇭 Zefix · 🇵🇱 KRS Ministry of Justice — and 22 more national registries under their respective open-data licences.

OpenRegistry — walking a UK retailer's shareholders 4 layers deep to the family that owns it

Above: an AI agent walks the shareholders of Iceland Foods Ltd through 4 UK holding companies — WD FF MIDCO → ICELAND VLNCO → LANNIS → WD FF LIMITED — and surfaces the 8 individuals who actually own the chain (Tarsem Dhaliwal 41.35% as the largest shareholder, Walker family 51.31% combined). Every share count, every percentage, read verbatim from the registry's own CS01 PDFs.

openregistry MCP server

OpenRegistry is your AI agent's live hotline to 30 national company registries — UK Companies House, France RNE, Germany Handelsregister, Italy InfoCamere (via EU BRIS), Spain BORME, Poland KRS, Korea OpenDART, Canada CBCA, 10 US states, and more.

We return the registry's own response — unmodified. Every field name, every status value, every raw filing byte (XHTML iXBRL / PDF / XBRL) is preserved exactly as the government's system emits it. The identifiers and jurisdiction routing let you reconstruct the government URL for any record. No aggregator markup. No field renames. No document re-rendering. No AI reinterpretation. No stale cache.

Chain queries across borders in a single prompt — a UK Ltd → its Luxembourg SARL → its Cayman LP → the Jersey trust → the individual beneficiary, all in one conversation. Walk ownership structures through 30 jurisdictions to unmask the real person behind any company.

Hosted endpoint: https://openregistry.sophymarine.com/mcp

A platform by Sophymarine.

The 6 pillars

1. LiveEvery tool call is a real-time query to the upstream government registry API at the moment you ask.
2. Direct-to-governmentNo aggregator, no third-party data warehouse, no nightly scrape. Your AI talks to UK Companies House, France INSEE, German Registerportal, Korean FSS OpenDART directly.
3. Unmodified + source-linkedEvery field name, every status code, every raw filing byte returned verbatim. The registry's own identifiers are preserved so any response traces back to the government record. Enterprise tier adds pre-synthesised source_url / registry_url / data_license fields.
4. Zero-staleNo cache layer we control can ever go stale. You see an update the moment the government records it. Contrast with commercial data providers that serve 6-24 hour-old snapshots.
5. StableProduction-grade reliability, running on Cloudflare Workers' global edge + a warm pool of per-jurisdiction workers for stateful registries.
6. Cross-borderChain queries across 30 registries in a single prompt. Walk UK Ltd → LU SARL → KY LP → individual without leaving the conversation.

How OpenRegistry differs

OpenRegistryOpenCorporatesCompanies House API directBureau van Dijk Orbis
Coverage30 national registries~140, mostly aggregated from upstream sourcesUK only~430M companies, aggregated
Data freshnessLive — every call hits upstreamScrape-and-cache (hours–days lag)Live7-day to quarterly refresh
Field shapeVerbatim upstream payload + unified envelopeNormalised to OC's own schemaPer-registry CH schemaBvD's own schema
Source identifier preservedYes — registry URL reconstructable from responseOC ID is primary; mapping back is lossyNativeBvD ID is primary
Filing PDFs / iXBRL bytesReturned rawMetadata only; full bytes paywalledNativePaywalled
Cross-border chain walkingOne MCP prompt, ≤30 jurisdictionsManual ID-stitching across countriesOut of scope (UK only)Limited to BvD-mastered entities
AuthenticationOAuth 2.1 + DCRAPI key (signup required)API key (signup required)Per-seat license, $30k–$50k+/yr
Self-serve free tierFree tier: 30 req/min, 6 core tools, all jurisdictionsFree for non-commercial only, throttledFree, single-jurisdictionNone
Made for AI agentsMCP-native, JSON-RPC over Streamable HTTPREST; no MCP wrapperREST; no MCP wrapperREST; no MCP wrapper

One-liner. OpenCorporates and BvD are aggregators that re-shape and cache; CH-direct is single-jurisdiction. OpenRegistry is the layer between an AI agent and the original government APIs — verbatim, live, multi-country, no API key for the free tier.

Where OpenRegistry deliberately doesn't have data (statutorily restricted BO registers post-CJEU C-37/20: DE, ES, IT, NL, LU, AT, MT, PT), the response carries a structured alternative_url pointing at the AML-obliged-only statutory portal. We don't pretend to have data we don't.

Quick example calls

Three full request → response examples for the most common tools. All three reproducible on the free tier. Calls are JSON-RPC over MCP Streamable HTTP at https://openregistry.sophymarine.com/mcp; for brevity we show the tool name + arguments + the unwrapped response.

1. search_companies — find a UK company

// Request
{
  "name": "search_companies",
  "arguments": { "jurisdiction": "GB", "query": "Monzo Bank", "limit": 5 }
}

// Response (truncated to 1 result)
{
  "jurisdiction": "GB",
  "count": 5,
  "results": [
    {
      "jurisdiction": "GB",
      "company_id": "09446231",
      "company_name": "MONZO BANK LIMITED",
      "status": "active",
      "incorporation_date": "2015-02-06",
      "registered_address": "Broadwalk House, 5 Appold Street, London, England, EC2A 2AG",
      "jurisdiction_data": {
        "company_number": "09446231",
        "company_status": "active",
        "company_type": "ltd",
        "date_of_creation": "2015-02-06",
        "title": "MONZO BANK LIMITED",
        "address_snippet": "Broadwalk House, 5 Appold Street, London, England, EC2A 2AG",
        "kind": "searchresults#company",
        "links": { "self": "/company/09446231" }
        // ... 20+ verbatim CH fields
      }
    }
  ]
}

2. get_persons_with_significant_control — UK PSC for a known company

// Request
{
  "name": "get_persons_with_significant_control",
  "arguments": { "jurisdiction": "GB", "company_id": "OC404063" }
}

// Response
[
  {
    "jurisdiction": "GB",
    "psc_id": "...",
    "name": "[REDACTED — UK CH residential-address suppression]",
    "kind": "individual-person-with-significant-control",
    "nature_of_control": ["ownership-of-shares-25-to-50-percent"],
    "notified_on": "2024-08-15",
    "is_active": true,
    "jurisdiction_data": {
      "etag": "...",
      "natures_of_control": ["ownership-of-shares-25-to-50-percent"],
      "notified_on": "2024-08-15",
      "country_of_residence": "United Kingdom",
      "date_of_birth": { "month": 7, "year": 1985 },
      "address": { "country": "United Kingdom" },
      "links": { "self": "/company/OC404063/persons-with-significant-control/individual/..." }
      // ... full CH PSC record
    }
  }
]

PSC ≠ shareholders. UK Companies House publishes a structured PSC register and a separate (filing-only) statement of capital. They disagree: a 10% shareholder appears in the statement of capital but not in PSC; a corporate trustee appears in PSC without being a shareholder. We surface both via get_persons_with_significant_control and get_shareholders respectively — see the shareholders-vs-PSC case study.

3. fetch_document — raw iXBRL annual accounts bytes

// Request — get the document_id from list_filings or get_financials first
{
  "name": "fetch_document",
  "arguments": { "document_id": "MzQ0MTUyNDU5N2FkaXF6a2N4", "max_bytes": 5000000 }
}

// Response (metadata + base64-encoded body)
{
  "jurisdiction": "GB",
  "document_id": "MzQ0MTUyNDU5N2FkaXF6a2N4",
  "content_type": "application/xhtml+xml",
  "size_bytes": 348721,
  "encoding": "base64",
  "content": "PCFET0NUWVBFIGh0bWwgUFVCTElDIC...",
  // signed proxy URL for human download / out-of-band fetch
  "proxy_url": "https://openregistry.sophymarine.com/document/gb/MzQ0MTUyNDU5N2FkaXF6a2N4/content?token=..."
}

The content is the literal iXBRL bytes Companies House sends — your AI agent parses or re-renders as it sees fit. We don't re-encode, normalise tags, or extract figures into our own schema. Pass format: "png" (Browser Rendering required) to receive a rasterised page-by-page render of scanned PDFs instead.

Quotas, errors, and back-off

OpenRegistry surfaces three distinct kinds of failure with structured responses so AI agents can branch on them.

Rate limits

Per-IP for anonymous, per-user for signed-in. The cross-border fan-out cap is a separate counter that limits how many distinct jurisdictions a caller can hit via search_companies in a rolling 60-second window.

When you exceed either limit, the response is HTTP 429:

{
  "jsonrpc": "2.0",
  "error": {
    "code": -32000,
    "message": "rate-limited",
    "data": {
      "reason": "rate-limited",
      "retry_after_ms": 12400,
      "scope": "ip"           // or "user" or "fanout"
    }
  }
}

The HTTP layer also sets the standard Retry-After: 13 header (seconds, rounded up). Honour retry_after_ms exactly — exponential back-off on top is unnecessary; the limit window is fixed-rolling, not adaptive. Fan-out ca

View source on GitHub