KYC workflow · 6 min read

A complete KYC dossier in five MCP calls

Published 2026-04-29 · Permalink

A "KYC dossier" sounds heavy: legal-name + registered-address verification, director identity + adverse-media screening, beneficial-owner disclosure, filing currency check, security-interest review. In practice on an MCP client wired to OpenRegistry, it's five tool calls against the same UK company number, all returning verbatim from Companies House.

This walkthrough uses Monzo Bank Limited (Companies House 09446231) as the example. Monzo is a useful test subject precisely because it's well- governed: it's a UK retail bank, FCA-regulated, with an active and noisy filing history. If a workflow fails on Monzo, it fails on most companies.

1. Resolve the company

search_companies("GB", "monzo bank")
// → 09446231 — Monzo Bank Limited — active — incorporated 2015-02-06

Search rather than guessing the number. Companies House publishes historical / dissolved / re-registered companies; an agent that hardcodes a number can hit a stale record. The first active-status hit on the canonical name is what most workflows want.

2. Profile

get_company_profile("GB", "09446231")

{
  "company_id": "09446231",
  "company_name": "MONZO BANK LIMITED",
  "status": "active",
  "incorporation_date": "2015-02-06",
  "registered_address": "Broadwalk House, 5 Appold Street, London EC2A 2AG",
  "jurisdiction_data": { ... 30+ verbatim CH fields ... }
}

The jurisdiction_data object contains every field Companies House publishes — SIC codes, accounts schedule, confirmation-statement schedule, previous names, jurisdiction (England and Wales), insolvency-history flag. OpenRegistry doesn't normalise these fields; if a downstream KYC tool needs a standardised industry classifier it builds it from this raw data.

3. Officers

get_officers("GB", "09446231")
// → 17 records: directors, secretaries, current + resigned
[
  { "name": "ANIL, TS", "role": "director", "is_active": true,  "appointed_on": "2020-09-01" },
  { "name": "WALSH, GARY", "role": "director", "is_active": true, ... },
  ... 15 more
]

4. Persons with significant control (PSC)

get_persons_with_significant_control("GB", "09446231")

[
  {
    "name": "REDACTED — UK CH residential-suppression rule",
    "natures_of_control": ["ownership-of-shares-25-to-50-percent"],
    "is_active": true,
    "notified_on": "2024-..."
  },
  ... more
]

PSC is not the shareholder list. UK PSC captures any natural person or registrable legal entity controlling more than 25% of voting / shares / appointment rights, or exercising significant influence. A 10% direct shareholder doesn't appear here. A corporate trustee with appointment rights does.

5. Recent filings

list_filings("GB", "09446231", { limit: 25 })
// → most-recent 25 filings; AR01/CS01 cadence + last accounts

Filing currency tells the analyst whether the company is up-to-date on its statutory obligations (AR01, CS01, accounts).

What the agent emits

The agent typically renders the dossier as a single structured response:

Five tool calls. A few hundred milliseconds per call. Sub-second total latency once the agent has resolved the company number. The bottleneck is the agent's own LLM tokens, not the registry.

What this replaces. Bureau van Dijk Orbis bundles a similar UK dossier inside an enterprise subscription. OpenCorporates sells a paid API for cleaned-up versions of the same data. Companies House publishes the underlying data for free. OpenRegistry is the transport that lets an AI agent consume it without writing a custom HTTP client.

Reproducing this

Connect any MCP client to https://openregistry.sophymarine.com/mcp, free tier (30 req/min/user). Or point at the same data on the web at /company/gb/09446231 — the Directors / PSC / Filings / Charges tabs are paid-tier on the web UI but the underlying data is free via MCP.