I built 10 Claude skills that live-query 27 government company registries
A few months ago I was researching a counterparty across 4 jurisdictions. Three hours of clicking through UK Companies House → Luxembourg RCS → Jersey Companies Registry → Cayman CIMA, copy-pasting ownership percentages into a spreadsheet. By the time I'd pieced the structure together, I wasn't sure whether the first-hop data was still current.
So I built OpenRegistry ΓÇö a free remote MCP server that gives AI agents live access to 27 national company registries ΓÇö and a skillpack of 10 Claude Agent Skills on top of it.
The key design decision, and the thing that makes it different from every commercial company-data provider I could find: every query is a direct call to the government's own system at the moment you ask, and the response is returned byte-identical.
The problem with commercial company data
Every major company-data provider (Bureau van Dijk, Dun & Bradstreet, Refinitiv, OpenCorporates) operates the same basic pattern:
- Crawl the government registries on a refresh cycle (6-24 hours, sometimes days).
- Ingest into a proprietary schema ΓÇö rename fields, normalize statuses, translate legal forms, merge duplicates.
- Enrich with derived data (D&B D-U-N-S numbers, industry classifications, credit scores).
- Sell access to the resulting snapshot.
This works well for broad market research where you want "a company dataset" to analyse in bulk. It breaks when:
- The data is fresh-sensitive. A counterparty filed administration yesterday? The commercial snapshot doesn't know yet. If you're onboarding them as a client, that's fatal.
- The data is provenance-sensitive. Your compliance team wants to cite the statutory record, not "Bureau van Dijk says". Without the government URL, your audit trail is weak.
- You need to cross borders. The commercial aggregator covers one country well, others poorly, and the joins between jurisdictions are their own opinion ΓÇö not the government's linking.
The design
OpenRegistry is a remote MCP server (streamable HTTP, MCP spec 2025-06-18). It exposes 14+ tools:
-
search_companies/get_company_profile(all 27 jurisdictions) -
get_officers/search_officers/get_officer_appointments -
get_persons_with_significant_control(beneficial ownership, where publicly published) -
get_shareholders(legal owners, different concept from UBO) -
get_charges(mortgages and security interests) -
list_filings/get_document_metadata/fetch_document(raw statutory filings) -
get_financials(native XBRL on FI and KR) -
list_jurisdictions/about(capability matrix)
Plus 10 MCP Prompts ΓÇö named workflows that appear in Claude Desktop / Cursor / Cline's prompt picker once you connect the server. No skill install needed.
The 6 design pillars
Every feature is tuned around these six invariants:
-
Live ΓÇö every tool call is a real-time query to the upstream government API. Pass
fresh=trueto bypass even the short-lived performance cache. - Direct-to-government ΓÇö no aggregator, no third-party warehouse, no nightly scrape. The AI agent talks to UK Companies House, France INSEE, German Registerportal, Korean FSS OpenDART directly.
-
Unmodified + source-linked ΓÇö every field name, every status code, every raw filing byte (XHTML iXBRL / PDF / XBRL) is preserved verbatim in
jurisdiction_data. Identifiers resolve back to the government URL for independent verification. - Zero-stale ΓÇö no cache layer we control can go stale. You see updates the moment the government records them.
- Stable ΓÇö CF Workers' global edge + warm per-jurisdiction workers for stateful registries (Liechtenstein JSF ViewState, DE Registerportal, KY CIG SSO-gated).
- Cross-border — chain queries across 27 registries in a single prompt. Walk UK Ltd → LU SARL → KY LP → individual without leaving the conversation.
The 10 skills
Each skill is a self-contained SKILL.md with YAML frontmatter and a step-by-step workflow. Drop them into ~/.claude/skills/ (Claude Code auto-indexes) or paste into any Claude-compatible agent's system prompt.
| Skill | One-prompt outcome |
|---|---|
| KYC & Cross-Border Due Diligence | Full statutory dossier: profile, directors, UBO, shareholders, charges, latest accounts |
| Cross-Border UBO Chain Walker Γ¡É | Walk the ownership chain across jurisdictions until you reach the real individual |
| Director Search & PEP Screening | Every company a person has directed + co-director network |
| Live Company Accounts & XBRL Financials | Latest statutory accounts as machine-readable XBRL / iXBRL / PDF + key figures |
| Corporate Filing Monitor | Material filings in a window, categorised and flagged |
| Global Company Name Availability Check | Is a proposed name free across 10+ countries? |
| Industry & Competitor Company Search | Every company in a sector across N jurisdictions |
| Shell Company Detector | 10-signal shell-probability scoring with citations |
| Phoenix Company Radar | Detect dissolved-then-reborn fraud patterns (UK s.216/217) |
| Sector Gatekeeper List | Every CIMA-authorised / regulated licensee in a sector |
Walked example: cross-border UBO in one prompt
The flagship skill is the Cross-Border UBO Chain Walker. Here's what happens when you give Claude a hotline to 27 government registries:
Prompt:
"Walk the full ownership chain of Revolut Ltd (UK Companies House 08804411) until you reach individuals or AML gates."
What Claude does (live tool chain):
1. get_company_profile(GB, 08804411)
→ confirms active, incorporation 2013, registered office in London
2. get_persons_with_significant_control(GB, 08804411)
→ returns 3 corporate PSCs (active PSCs hold 25-50% shares + voting rights)
3. For each corporate PSC:
→ resolve home jurisdiction (UK PSCs, in this case; different chains go abroad)
→ recurse: get_persons_with_significant_control on the parent
4. Stop at: (a) individuals, (b) listed public entities, (c) AML-gated jurisdictions
5. Render as ASCII ownership tree, cite every node with the government identifier.
Each hop is a live call. No cache. If the parent registered a new PSC filing yesterday, the tree reflects it today.
When the chain crosses into Luxembourg (B-numbered SARL), Cayman (CIMA reference + General Registry), or Germany (HRB-numbered GmbH), the skill is explicit about the AML gate that stopped it:
Example Luxembourg Holdings SARL (LU B234567)
Γö£ΓöÇ BLOCKED BY AML GATE ΓÇö LU UBO register
Γöé is AML-obliged-entity only post CJEU C-37/20
Γöé (Nov 2022). Alternative: lbr.lu with legitimate-interest
Γöé application for journalists / NGOs.
Transparent about what we can and can't see. Compliance-friendly.
Technical implementation highlights
A few pieces I'm proud of:
Per-jurisdiction worker pool. Registries with JSF / ViewState (Liechtenstein Handelsregister, DE gemeinsames Registerportal, KY CIG SSO) can't run in a stateless CF Worker. They need a warm Chromium context with preserved session. So the /mcp endpoint is stateless Workers, but queries to those countries dispatch to a dedicated per-country worker pool we session-refresh ahead of demand.
Structured 501 routing. Instead of a plain "this doesn't work", every 501 carries alternative_tool + alternative_args or alternative_url. Example: calling get_officers on a Czech political party returns 501 with alternative_tool="search_specialised_records" and alternative_args={source: "rpsh"} pre-filled. The AI doesn't have to guess the fallback.
MCP Elicitation for multi-country search. When the AI doesn't know which country a company is in, instead of silently fanning out across all 27 (burning rate limits), search_companies({ jurisdictions: [...] }) pops an MCP elicitation dialog in the client showing the inferred top-3 countries. The user can deselect, pick others, or confirm within their tier's fan-out cap.
Native XBRL everywhere possible. FI (PRH) and KR (DART) publish XBRL; we surface it natively via get_financials. GB returns XHTML iXBRL (GAAP / IFRS concept URIs embedded in <ix:nonFraction> tags) which is machine-readable without re-rendering.
Transparent AML gates. Post CJEU C-37/20 (Nov 2022) the UBO registers in DE, ES, IT, NL, LU, AT, MT, PT are no longer publicly queryable. Russia under 115-FZ art. 6.1 and Cayman under BOTA 2023 are also gated. The tool explicitly 501s with alternative_url pointing at the statutory AML-obliged-entity portal. No silent omission.
What it costs
- Anonymous: free, 20 req/min per IP, 3 countries / 60s fan-out. No signup, no API key.
- Free (signed in): 30 req/min per user.
- Pro: $9/month, 180/min, 10-country fan-out.
- Max: $29/month, 900/min, 30-country fan-out.
-
Enterprise: custom, unlimited, pre-synthesised
source_url/registry_url/data_licensein every response.
All tiers receive the full unmodified upstream data. Enterprise adds pre-built source-URL fields for audit-trail convenience.
Try it
Install in Claude Code:
claude mcp add --transport http OpenRegistry https://openregistry.sophymarine.com/mcp
npx skills add sophymarine/openregistry
Or manual:
git clone https://github.com/sophymarine/openregistry
cp -r openregistry/skills/* ~/.claude/skills/
Test probe:
curl -X POST https://openregistry.sophymarine.com/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Or just add the endpoint to Claude Desktop / Cursor / Cline MCP config ΓÇö the 10 workflows appear as MCP Prompts in the prompt picker without any separate install.
Also published on:
- Official MCP Registry:
io.github.sophymarine/openregistry - MCP.so
- GitHub docs-repo (skills + docs, no source code)
If you build agents that touch company data ΓÇö KYC onboarding, M&A research, AML checks, investigative journalism, sanctions screening ΓÇö I'd love feedback. Especially on the jurisdictional AML gates: which jurisdiction's gate matters most for your use case and what would help you work around it.
OpenRegistry is a platform by Sophymarine.
Top comments (0)