openregistry
OpenRegistry is an MCP server providing live, unmodified access to 27 national company registries for corporate intelligence, due diligence, and cross-border ownership chain analysis.
Company Search & Discovery
Search companies by name, keyword, or structured filters (legal form, revenue, industry, etc.) across 27+ jurisdictions
Geographic search for French companies by proximity
Count companies matching a query (IE) or check name availability (IM)
Company Profiles & Structure
Retrieve full company profiles: status, incorporation date, registered address, and raw registry data
List officers (directors, secretaries, liquidators) with appointment/resignation dates
Search officers by name to trace their full corporate footprint
List shareholders/members (full equity roster) from jurisdictions that disclose them
Get persons with significant control (beneficial owners/UBOs) above statutory thresholds
List registered charges (mortgages, fixed/floating charges, security interests)
Filings & Documents
List full filing history, filterable by category (accounts, officers, charges, incorporation, etc.)
Get financial statements with fiscal period normalization and download URLs
Fetch filing documents inline (PDF/XBRL/iXBRL/XHTML, verbatim)
Navigate large PDFs via outline, per-page previews, and landmark detection
Search full-text within cached documents; fetch specific pages in PDF, text, or PNG
Reference & Jurisdiction Data
List jurisdictions with schema references, ID formats, status mappings, supported tools, and quirks
Decode registry code-lists (FI/CZ/CH) for legal forms, industries, and regions
Country-Specific Tools
CZ: Specialised sub-register records (trade licences, healthcare, insolvency, etc.), address standardisation against RÚIAN, change-notification batches
BE: List establishment units (physical locations) of an enterprise
ES: Locate BORME Section I acto-inscripción entries (appointments, capital changes, dissolution)
FR: Geographic proximity search with rich filters (NAF code, employee band, certifications)
IM: Check proposed company name availability
Cross-Border Chain Walking
Walk ownership structures across 27 jurisdictions in a single session (e.g. UK Ltd → LU SARL → KY LP → individual beneficiary)
Pre-Built Workflow Skills
KYC & Cross-Border Due Diligence, UBO Chain Walking, Director/PEP Screening, Live Accounts & XBRL Financials, Filing Monitor & Event Alerts, Name Availability Check, Competitor Search, Shell Company Detector, Phoenix Company Radar, Sector Gatekeeper List
Integrates with CrewAI to enable multi-agent teams to search companies, retrieve profiles, officers, financials, and charges from 27 government registries.
Enables LangChain agents to query 27 national company registries in real-time, perform cross-border ownership chain walks, fetch unmodified government filings, and search officers across jurisdictions.
Allows LangGraph agents to access live company registry data, walk ownership structures across multiple countries, and retrieve statutory filings from government sources.
Provides TypeScript tools via the Vercel AI SDK for querying company registries, fetching documents, and walking cross-border ownership chains.
OpenRegistry
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 anonymous tier; paid keys for higher quota.
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.
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 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. Live | Every tool call is a real-time query to the upstream government registry API at the moment you ask. |
2. Direct-to-government | No 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-linked | Every 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 |
4. Zero-stale | No 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. Stable | Production-grade reliability, running on Cloudflare Workers' global edge + a warm pool of per-jurisdiction workers for stateful registries. |
6. Cross-border | Chain queries across 30 registries in a single prompt. Walk UK Ltd → LU SARL → KY LP → individual without leaving the conversation. |
How OpenRegistry differs
OpenRegistry | OpenCorporates | Companies House API direct | Bureau van Dijk Orbis | |
Coverage | 30 national registries | ~140, mostly aggregated from upstream sources | UK only | ~430M companies, aggregated |
Data freshness | Live — every call hits upstream | Scrape-and-cache (hours–days lag) | Live | 7-day to quarterly refresh |
Field shape | Verbatim upstream payload + unified envelope | Normalised to OC's own schema | Per-registry CH schema | BvD's own schema |
Source identifier preserved | Yes — registry URL reconstructable from response | OC ID is primary; mapping back is lossy | Native | BvD ID is primary |
Filing PDFs / iXBRL bytes | Returned raw | Metadata only; full bytes paywalled | Native | Paywalled |
Cross-border chain walking | One MCP prompt, ≤30 jurisdictions | Manual ID-stitching across countries | Out of scope (UK only) | Limited to BvD-mastered entities |
Authentication | OAuth 2.1 + DCR; anonymous tier free | API key (signup required) | API key (signup required) | Per-seat license, $30k–$50k+/yr |
Self-serve free tier | 20 req/min/IP — all tools, all jurisdictions | Free for non-commercial only, throttled | Free, single-jurisdiction | None |
Made for AI agents | MCP-native, JSON-RPC over Streamable HTTP | REST; no MCP wrapper | REST; no MCP wrapper | REST; 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 against the free anonymous tier — no signup, no API key. 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_controlandget_shareholdersrespectively — 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 cap (scope: "fanout") is a 60-second rolling window — the second your oldest country falls off, you can hit a new one. Pro tier caps at 10 distinct countries / 60s, Max at 30, Enterprise unlimited.
Statutorily restricted (CJEU C-37/20 and similar)
Some beneficial-ownership registers became access-restricted to AML-obliged entities post-CJEU C-37/20 (DE, ES, IT, NL, LU, AT, MT, PT) and the Cayman Beneficial Ownership Transparency Act. We don't proxy these — the tool returns HTTP 501 with structured guidance:
{
"jurisdiction": "DE",
"error": "not_proxied_by_design",
"reason": "CJEU-C-37-20",
"alternative_url": "https://www.transparenzregister.de",
"alternative_access": "AML-obliged entities only (banks, lawyers, notaries, etc.)",
"human_message": "The German Transparency Register is statutorily gated since 22 Nov 2022."
}This is a design response, not a transient failure — retrying won't help. The alternative_url is the canonical statutory portal where qualified entities can register for access.
Upstream errors and tool-level structured 501s
When the upstream registry has its own outage, we surface its error verbatim with a structured wrapper:
{
"jurisdiction": "ES",
"error": "upstream_error",
"upstream_status": 524,
"human_message": "Spain BORME upstream timed out (Madrid bulletin renderer slow). Retry in 30-60s.",
"retry_after_ms": 45000
}Some tools also return 501 with an alternative tool suggestion when the upstream registry doesn't expose the requested concept (e.g. CZ political parties don't have officers in the standard sense — call search_specialised_records with source="rpsh" instead):
{
"error": "alternative_tool_required",
"alternative_tool": "search_specialised_records",
"alternative_args": { "jurisdiction": "CZ", "source": "rpsh", "...": "..." },
"human_message": "Czech political parties register is exposed via the RPSH sub-source."
}Recommended client back-off
Error | Action |
| Sleep |
| Don't retry the same call; route the next request to a country you've already hit in the window. |
| Don't retry. Surface |
| Re-issue with |
| Sleep |
| Don't retry. Re-search with |
A reference back-off implementation is published in every framework integration guide under /docs/integrations.
Ready-to-use skills
We publish 10 professional Claude Agent Skills for the most common OpenRegistry workflows. Drop them into your Claude Code project's .claude/skills/ directory or into any Claude-compatible agent — invoke by intent.
# | Skill | Outcome in one prompt |
1 | Full statutory dossier: profile + directors + UBO + shareholders + charges + latest accounts | |
2 ⭐ | Walk the ownership chain across jurisdictions until you reach the real individual | |
3 | Every company a person has run + co-director network | |
4 | Latest statutory accounts as machine-readable XBRL / iXBRL / PDF + key figures | |
5 | Material filings in a window, categorised and flagged | |
6 | Is a name free to register across 10+ countries? | |
7 | Every company in a sector across N jurisdictions, ranked + enriched | |
8 | Flag 1-director + no-accounts + overseas-office shells (AML signal) | |
9 | Detect dissolved-then-reborn fraud patterns (same director, same address) | |
10 | Every CIMA / FCA / BaFin / FSS-licensed regulated entity |
See skills/README.md for the skillpack overview.
Same 10 workflows, also as MCP prompts
Every skill above is also served by the MCP server as a named prompt — so any MCP-compatible client (Claude Desktop, Cursor, Cline, Goose, Zed, …) shows them in its prompt picker without installing skill files. Call prompts/list to discover them, prompts/get to invoke. Same names: kyc_cross_border_due_diligence, ubo_cross_border_chain_walker, director_search_pep_screening, live_company_accounts_xbrl, corporate_filing_monitor, global_company_name_availability, industry_competitor_search, shell_company_detector, phoenix_company_radar, sector_gatekeeper_list.
Connect
OpenRegistry works with every major MCP-capable client. The same https://openregistry.sophymarine.com/mcp endpoint works across all of them — anonymous tier needs no signup.
Claude Desktop
Settings → Connectors → Add custom connector → paste https://openregistry.sophymarine.com/mcp.
For older builds without the Connectors UI, add to claude_desktop_config.json:
{
"mcpServers": {
"openregistry": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://openregistry.sophymarine.com/mcp"]
}
}
}Claude Code
claude mcp add --transport http openregistry https://openregistry.sophymarine.com/mcpOn Claude Code 2.1.1+ you can also use the JSON form:
claude mcp add-json openregistry '{"type":"http","url":"https://openregistry.sophymarine.com/mcp"}'Gemini CLI
One-line install via the gemini-extension.json manifest in this repo:
gemini extensions install https://github.com/sophymarine/openregistryOr add to ~/.gemini/settings.json manually (Gemini uses httpUrl, not url):
{
"mcpServers": {
"openregistry": {
"httpUrl": "https://openregistry.sophymarine.com/mcp"
}
}
}Google's consumer Gemini app at gemini.google.com does not support custom MCP today — only the CLI and Gemini Enterprise (Google Cloud admin path) do.
ChatGPT
Plus / Pro / Business / Enterprise / Education plans only (Free tier doesn't expose Developer Mode).
Settings → Apps & Connectors → Advanced settings → enable Developer Mode.
On the Connectors page, click Create and paste
https://openregistry.sophymarine.com/mcp.
See OpenAI's developer-mode help article.
Perplexity
Pro / Max / Enterprise plans only. Settings → Connectors → Add custom remote connector → paste the URL → choose OAuth. Works in regular chat, the Comet browser, and Computer agent workflows. (Changelog 2026-03-13.)
Cursor
Or add to ~/.cursor/mcp.json manually:
{
"mcpServers": {
"openregistry": {
"url": "https://openregistry.sophymarine.com/mcp"
}
}
}VS Code (1.101+, Copilot Agent mode)
Or add to .vscode/mcp.json (workspace) or User Settings → MCP. VS Code uses servers (not mcpServers) and requires type: "http":
{
"servers": {
"openregistry": {
"type": "http",
"url": "https://openregistry.sophymarine.com/mcp"
}
}
}GitHub Copilot in JetBrains, Visual Studio, Xcode, and Eclipse also supports custom MCP via the same
mcp-config.jsonpattern — see docs.github.com/copilot for the IDE-specific setup. Copilot CLI uses~/.copilot/mcp-config.jsonor the interactive/mcp addcommand.
Microsoft 365 Copilot (Word / Excel / PowerPoint / Teams / Outlook)
Organization-level deployment via Microsoft Copilot Studio agent path. Requires a Microsoft 365 Copilot license.
In Microsoft Copilot Studio, open or create an agent → Tools → Add a tool → New tool → Model Context Protocol.
Paste
https://openregistry.sophymarine.com/mcp, then for Authentication pick OAuth 2.0 → Dynamic discovery (OpenRegistry implements DCR with discovery — zero config).Publish the agent and submit it for admin approval. After your Global / Teams Admin approves it in the Microsoft 365 admin center, it appears in the Agent Store across Teams, Outlook, Word, Excel, and PowerPoint.
See Microsoft's Copilot Studio MCP docs and the Agent Store guide.
Cline
Settings → Cline → MCP Servers → Edit settings → paste into cline_mcp_settings.json:
{
"mcpServers": {
"openregistry": {
"url": "https://openregistry.sophymarine.com/mcp",
"transport": "streamable-http"
}
}
}See llms-install.md for automated LLM-driven installs.
Windsurf
Cascade panel → hammer icon (🔨) → Configure opens ~/.codeium/windsurf/mcp_config.json. Add this block (note Windsurf uses serverUrl, not url), then click Refresh (🔄):
{
"mcpServers": {
"openregistry": {
"serverUrl": "https://openregistry.sophymarine.com/mcp"
}
}
}Anything else speaking MCP
Zed, Goose, Continue, and any other MCP 2025-06-18 client work with the standard config:
{
"mcpServers": {
"openregistry": {
"url": "https://openregistry.sophymarine.com/mcp"
}
}
}Streamable HTTP transport per MCP spec 2025-06-18. OAuth 2.1 authorization flow for authenticated tiers (Dynamic Client Registration per RFC 7591 — no API key to paste).
AI agent frameworks (code samples)
Every major agent framework ships a generic MCP adapter, so OpenRegistry's 27 tools + 10 prompt workflows plug in with zero framework-specific code. Minimum working example per framework:
LangChain / LangGraph (Python) → openregistry.sophymarine.com/docs/integrations/langchain
LlamaIndex (Python) → /docs/integrations/llamaindex
CrewAI (Python) → /docs/integrations/crewai
Haystack (Python) → /docs/integrations/haystack
AutoGen (Microsoft) (Python) → /docs/integrations/autogen
Vercel AI SDK (TypeScript) → /docs/integrations/vercel-ai-sdk
Tiers
Tier | Price | Rate limit | Cross-border fan-out | Source URLs |
Anonymous | free | 20/min per IP | 3 countries / 60s | identifiers only (URL reconstructable) |
Free (signed in) | free | 30/min per user | 3 countries / 60s | identifiers only |
Pro | $9/mo | 180/min per user | 10 countries / 60s | identifiers only |
Max | $29/mo | 900/min per user | 30 countries / 60s | identifiers only |
Enterprise | contact | 3000/min per user | unlimited |
All tiers receive the full unmodified upstream data — the only thing Enterprise adds is pre-built source-URL fields for audit-trail convenience.
Provenance & Auditability
Every response preserves the upstream registry's identifiers so any fact can be verified at the government record:
jurisdiction+company_id→ reconstruct the government URL (e.g.https://find-and-update.company-information.service.gov.uk/company/09446231)document_id→ the government's own filing identifier, resolvable back to their portaljurisdiction_data→ the raw upstream object with every field name preservedFiling documents (XHTML iXBRL / PDF / XBRL) returned as raw bytes — no re-rendering
Enterprise tier pre-synthesises source_url / registry_url / registry_name / data_license / alternative_url into every response for one-click audit-trail in compliance reports.
Security and compliance
Auth: OAuth 2.1 + PKCE, passwordless email magic links, RFC 7591 Dynamic Client Registration. No pre-shared API keys.
Privacy: OpenRegistry proxies official public-registry data. Beneficial-ownership registers that became access-restricted post-CJEU C-37/20 (DE, ES, IT, NL, LU, AT, MT, PT) are not proxied — the tool returns
501 alternative_urlpointing at the statutory gated portal (AML-obliged entities only). We explicitly flag where AML gates block the ownership chain.Rate limits: per-user for authenticated traffic, per-IP for anonymous — plus a per-jurisdiction upstream-protection cap shared across all users, to keep OpenRegistry a good citizen with the registries we depend on.
Support
Hosted app + account management: openregistry.sophymarine.com/account
Tool capability matrix: call
list_jurisdictionsor visit openregistry.sophymarine.com/jurisdictionsEnterprise inquiries / partnerships: contact@sophymarine.com
Status + uptime: openregistry.sophymarine.com/status
This repo is documentation only. The OpenRegistry service implementation is closed-source; raise issues here for the integration experience (documentation, examples, install flows).
Security
Found a vulnerability? Please email security@sophymarine.com rather than opening a public issue. See SECURITY.md for the full reporting policy, scope, and safe-harbor terms.
Code of Conduct
Participation in this project is governed by our Code of Conduct, adapted from the Contributor Covenant 2.1. Report issues to conduct@sophymarine.com.
Contributing
Issues and pull requests are welcome for:
Bridge bugs (
server.mjs)Documentation improvements (README, llms-install.md, GEMINI.md)
Skill / prompt refinements (
skills/,commands/,.claude-plugin/)Brand assets and metadata (
brand/,glama.json,.mcp.json,gemini-extension.json)
The OpenRegistry service implementation (jurisdiction adapters, MCP server, billing, auth) is closed-source and not accepted via PR. For tool / behavior requests against the hosted service, open an issue describing the use case.
Changelog
Tagged releases live on the GitHub Releases page. Versions follow SemVer — patch for fixes, minor for additive changes, major for breaking changes to the bridge protocol or tool surface contract.
License
Documentation, skills, and brand assets in this repository are released under CC-BY-4.0 — you may share and adapt the material for any purpose with attribution. The openregistry stdio bridge (server.mjs) is also released under CC-BY-4.0 for consistency. The hosted MCP service implementation is not open-source and is operated under separate commercial terms; see the Tiers section.
See NOTICE.md for third-party attribution.
OpenRegistry is a platform by Sophymarine.
© 2026 Sophymarine. OpenRegistry and Sophymarine are trademarks of Sophymarine. Documentation in this repository is published under CC-BY-4.0.
Maintenance
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sophymarine/openregistry'
If you have feedback or need assistance with the MCP directory API, please join our Discord server