🇲🇾 Malaysia — Suruhanjaya Syarikat Malaysia (SSM) — Companies Commission of Malaysia
Access Malaysia's official company register in real time via the OpenRegistry MCP endpoint. Unified schema, source-linked, live passthrough (no caching).
Data license: Public information held by SSM under the Companies Act 2016, Registration of Businesses Act 1956, Limited Liability Partnerships Act 2012 and Companies Commission of Malaysia Act 2001. Tier 1 (this adapter) returns name + registration numbers + entity type verbatim from the SSM e-Info authenticated search surface; per-document downloads (Company Profile RM 15.40 / CTC RM 40.80, Charges RM 25.40, Certificate of Good Standing RM 105.40, Financial Comparison RM 25.40-105.40) stay paid and are not proxied here. Redistribution of SSM-purchased documents is restricted by SSM T&C.
Real-time: yes — every call hits upstream
Caching notes: Search: 10 s in-memory cache per (keyword, stype, limit) tuple to de-duplicate repeated calls within one AI turn; pass fresh=true to bypass. Bearer token acquired via /weblogin is cached in-process; refreshed on 401.
Malaysia — official company register. Tier 1 (credentialed) returns name + registration numbers + entity type. Tier 0 returns 501 with a live match-count. Filings / officers / shareholders / PSC / charges / documents always 501.
Company ID format
Two forms coexist. New format (from 2019-10-11, SSM Announcement ID 134): 12 digits — YYYY + NN (01 Company / 10 Business / 02 LLP / 50 Audit Firm) + NNNNNN sequence; e.g. '199301027559'. Old format: 6 digits + dash + 1-letter code (A / D / H / K / M / P / T / U / V / W / X for Peninsular Malaysia; LLP suffix for older LLPs); e.g. '282297-P'. Adapter accepts either form verbatim and emits new_no as the canonical company_id (old_no + AlphaCode preserved in jurisdiction_data). Post-2019 entities are displayed by SSM e-Info as 'NEW (OLD-X)'.
Native values upstream reports: n/a — SSM e-Info's free search surface does not expose entity status; status (Existing / Struck Off / Dissolved / Wound Up) is only returned on paid Company Profile purchases
Mapping to the unified four-value enum:
Unified
Native values
active
(none)
inactive
(none)
dissolved
(none)
unknown
n/a — SSM e-Info's free search surface does not expose entity status; status (Existing / Struck Off / Dissolved / Wound Up) is only returned on paid Company Profile purchases
Known quirks
id_formatinfo — Two ID forms coexist. New format (from 2019-10-11): 12 digits — YYYY + NN (01 Company, 10 Business, 02 LLP, 50 Audit Firm) + 6-digit sequence, e.g. '199301027559'. Old format: 6 digits + dash + letter, e.g. '282297-P' (letters A/D/H/K/M/P/T/U/V/W/X for Peninsular, LLP suffix for older LLPs). Adapter accepts either verbatim; new_no is emitted as canonical company_id, old_no + AlphaCode preserved in jurisdiction_data.
routingblocker — When no credentialed session is configured, search_companies throws 501 after running a live match-count probe; the error hint carries a per-bucket count breakdown and points at the official register's free signup. get_company_profile throws 503 with the same signup pointer. Every other tool stays 501.
searchinfo — Keyword minimum is 2 characters. Accepts a name fragment (contiguous substring of the registered name), the 12-digit new-format number, or the old-format 'NNNNNN-X'. Optional 'type:company' / 'type:business' / 'type:audit' / 'type:llp' prefix targets one entity-type bucket. Upstream paginates 10 rows/page; the adapter walks pages up to opts.limit and dedupes adjacent-page duplicates observed live.
statuswarning — Coarse status is always 'unknown' on Tier 1 results. The free search surface does NOT expose entity status (Existing / Struck Off / Dissolved / Wound Up) — status is only inside the paid Company Profile document. status_detail carries the entity-type name (Company / Business / Audit Firm / LLP), not a status.
filingsblocker — list_filings always returns 501. The register has no standalone filings endpoint; filing history sits inside the paid Company Profile / Financial Comparison products.
officersblocker — get_officers, search_officers, and get_officer_appointments all return 501. Directors, company secretary, and officer data are inside the paid Company Profile product and the free surface has no cross-company director-tracing capability.
shareholdersblocker — get_shareholders returns 501. The members / pemegang syer register is inside the paid Company Profile product; a standalone Shareholder Listing And Analysis report is a separate paid purchase.
pscblocker — get_persons_with_significant_control returns 501. Malaysia's Section 56 beneficial-ownership register is filed with the registry but the lookup surface is restricted to AML-reporting institutions (banks, licensed company secretaries, audit firms) — not openly queryable by the public.
chargesblocker — get_charges returns 501. Company charges are a paid per-company product, not proxied.
documentsblocker — get_document_metadata and fetch_document return 501. Documents are per-purchase only; there is no free metadata surface and paid downloads are not proxied.
Available jurisdiction_data fields
Every tool response carries a jurisdiction_data object with the raw upstream fields (names unchanged). The full field set per record type: