Smithery's MCP Proxy and managed identity shut down on October 31. See what's changing

SmitherySign up for Arcade

OpenRegistry

sophymarine/openregistry · openregistry.sophymarine.com

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

Tools: search companies, get profiles, officers, shareholders, 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.

Tools10

Last checked October 15, 2026

  • list_jurisdictions

    Per-country reference. In-process metadata lookup — no upstream HTTP, no rate cost. Pass EXACTLY ONE of: • jurisdiction='GB' — registry name + URL, data license, company-ID format with examples, native-to-unified status enum mapping, and the list of tools supported. • supports_tool='get_officers' — which jurisdictions implement a given tool (name matched exactly against registered tool names). Use this to plan calls. Do NOT use it to fetch actual data — call the named tool directly. Passing both params or neither returns a 400 with the matching usage hint.

  • search_companies

    Search a national company registry by name or keyword. Pass EXACTLY ONE of: • jurisdiction='GB' - single country, direct. • jurisdictions=['GB','NO','FR'] - multi-country when you're unsure; the server asks the user to confirm (clients with MCP elicitation) or errors back asking you to ask in chat. Per-tier cap on distinct countries per call: anonymous=3, pro=10, max=30, enterprise=unlimited. Returns candidates with unified fields (company_id, company_name, status, incorporation_date, registered_address) plus raw upstream jurisdiction_data. For country-specific filters (FR ca_min, CZ czNace, CH canton, etc.) pass the filters object — call list_jurisdictions for the per-country schema.

  • search_officers

    Find people holding or who held officer positions (director, secretary, member, partner) in a jurisdiction's registry by name. Returns candidates with officer_id, name, and (where exposed) appointment count. Entry point for person-centric investigations. Use this when only the person's name is known. If you already have the company_id, call get_officers instead — it returns the authoritative board roster for that company; this tool is a name-search index and may miss officers whose names are redacted, transliterated, or stored under a former spelling upstream. Read-only — no upstream mutation, results briefly cached. Name-matching semantics vary per registry (exact / prefix / token / fuzzy); full names work best, partial names broaden recall. query matches against the registry's officer name index only — not a free-text web search — so role keywords, synonyms, or company names won't match. limit is an upper bound capped at 100; the registry may return fewer. Unsupported jurisdictions return 501; call list_jurisdictions({supports_tool:'search_officers'}) for the coverage matrix.

  • get_company_profile

    Fetch a company's structured profile by registry-specific ID. Returns unified top-level fields (company_id, company_name, status, status_detail, incorporation_date, registered_address) plus raw upstream under jurisdiction_data. status is a coarse active/inactive/dissolved/unknown enum; status_detail keeps the registry's native string; registered_address is flattened to one string with the upstream nested form preserved in jurisdiction_data. Does NOT bundle officers / shareholders / filings / charges — call those tools separately. ID format varies per registry; pull company_id from search_companies rather than guessing. For per-country ID format and the full jurisdiction_data field catalogue, call list_jurisdictions({jurisdiction:'<CC'}). include.vr (CZ-only), include.history (PL-only), and include.establishments (BE-only) each trigger an EXTRA upstream call and are silently ignored elsewhere — only set the ones you actually need. fresh=true bypasses the short-TTL cache and forces a registry round-trip; default cached path is fine for most lookups since profiles change only on filings.

  • list_filings

    Return a company's filing history, newest first. Each filing has filing_id, filing_date, category, description, and (when upstream exposes one) a document_id that round-trips to get_document_metadata / fetch_document. Raw upstream fields preserved under jurisdiction_data. Filter via the optional category. Common normalized values: 'accounts', 'annual-return', 'capital', 'charges', 'confirmation-statement', 'incorporation', 'insolvency', 'liquidation', 'mortgage', 'officers', 'resolution'. Native upstream form codes also accepted. This tool returns metadata only — call fetch_document on document_id for the actual filing bytes. has_document=false means the body is paywalled or unavailable upstream. Pagination uses limit (default 25, max 1000) plus cursor (GB) or offset (IE). Unsupported jurisdictions return 501; call list_jurisdictions for per-country category values and pagination style.

  • get_shareholders

    Return the shareholders / members / quota-holders — the legal-statutory equity roster published by the registry, no ownership-threshold filter. Use for any shareholder / member / quota-holder question. Shareholders are a DIFFERENT concept from beneficial owners (PSC / UBO), who appear on a separate register only when above a statutory control threshold (typically 25%). The two can disagree: a 10% shareholder is on the members register but not the PSC register; a corporate trustee can be a PSC without appearing on the members register. Disclosure is legal-form-conditional: private-limited / LLC forms typically expose quota-holders publicly; joint-stock / public-limited forms keep shareholders in a private book. Responses therefore may be an empty list, a pointer to the relevant filing (call fetch_document on the returned document_id), or a statutory explanation — every response carries a disclosure flag and/or note. Raw upstream in jurisdiction_data. Unsupported jurisdictions return 501; call list_jurisdictions({supports_tool:'get_shareholders'}) for the coverage matrix. company_id must come from search_companies (do not synthesize); fresh=true bypasses cache and refetches from upstream — useful only right after a known filing event since the roster changes only when filings are submitted.

  • get_officers

    Return a company's officers — current directors, secretaries, members, partners, board members, procurists, liquidators, plus historical resignations by default. Each officer has a unified shape (officer_id, name, role, appointed_on, resigned_on, is_active) plus raw upstream in jurisdiction_data. Limitations: • Role labels pass through in the registry's native language (Styremedlem, Předseda představenstva, Président) — translate client-side. • Birth-date precision varies by registry. • Officer-ID stability varies: corporate officers usually carry the corporate's own company_id; natural persons may carry a synthetic index. • Some registries mask names under GDPR (masking is upstream). • Jurisdictions without an officer feed return 501. When NOT to use: if you only have a person's name (no company_id), call search_officers first to find candidates. For shareholders / quota-holders, use get_shareholders — separate register, different concept. include_resigned=false narrows to currently-serving only (some registries don't expose resigned officers regardless of this flag). group_by_person=true is CZ-only and collapses one person's consecutive appointments (member → chair → vice-chair) into a single entry with the chain under jurisdiction_data._appointments[]. fresh=true bypasses the short-TTL cache.

  • get_document_metadata

    Retrieve metadata for a filing document by document_id (from list_filings). Returns available content formats with byte sizes, page count, source URL, creation date. Raw upstream preserved under jurisdiction_data. Call this before fetch_document when a document may be large or its format is unknown — cheaper than a full fetch. Do NOT construct or guess document_id — some registries use composite IDs that must come from list_filings; synthesized IDs will 404. Empty available_formats means the body is paywalled or unavailable upstream. Unsupported jurisdictions return 501; call list_jurisdictions({supports_tool:'get_document_metadata'}) for the coverage matrix. fresh=true bypasses cache but is rarely useful — filings are immutable once registered.

  • fetch_document

    Read a filing's content by document_id from list_filings. Numbers and prose live inside the document; list_filings metadata only locates filings. RESPONSE SHAPES: • kind='embedded' (under max_bytes, ~20 MB default) — full bytes_base64, source_url_official (evergreen registry URL), source_url_direct (short-TTL signed proxy URL). PDFs render as a native document block. • kind='resource_link' (oversized) — NO bytes_base64. Returns reason, next_steps, both source URLs, and index_preview {page_count, text_layer, outline_present}. Call get_document_navigation to locate pages, then re-call this tool with pages='N-M' and format='pdf'|'text'|'png'. When NOT to use: to enumerate a company's filings, use list_filings. To check size or available formats before deciding, use get_document_metadata. Never synthesize document_id — composite IDs will 404. CRITICAL: on failure (rate limit / 5xx / timeout) do NOT fabricate names, numbers, or dates — tell the user what failed and offer retry or source_url_official. Outline titles, previews, and navigation snippets are for LOCATING pages, never for quoting. max_bytes is a hard inline cutoff: raising it forces full proxy/R2 transfer (slower, costlier); the default returns resource_link for big PDFs so you can page-fetch. fresh=true bypasses the R2 cache and refetches from upstream — filings are immutable so it's rarely needed. source_url_official auto-resolves from the most recent list_filings call; company_id / transaction_id / filing_type / filing_description are overrides only when document_id did NOT come through list_filings.

  • get_document_navigation

    Return a navigation index for a cached document: PDF outline / bookmarks, per-page text previews (~200 chars each), keyword-matched landmarks (balance sheet / directors report / auditor report), text-layer classification, and source URLs. Call this FIRST for PDFs too large to embed (fetch_document returned kind='resource_link'). Use outline / previews / landmarks to pick a page range, then re-call fetch_document with pages='N-M' for the authoritative content. company_id / transaction_id are overrides only for the rare case where document_id did NOT come through list_filings (otherwise auto-resolved from the side-cache). Navigation aids only: previews, outline titles, landmark matches, and snippets may be truncated or contain OCR errors. NEVER cite them for figures, quotes, dates, or names — always quote from a subsequent fetch_document page-range fetch. Requires the document bytes to already be cached via fetch_document; fresh=true re-runs pdfjs against the cached bytes but does NOT re-fetch upstream, so use it only when the index looks stale or empty.