DEV Community

Cover image for How to give Claude a Singapore company-verification (KYB) tool with the Apify MCP server
Michael
Michael

Posted on • Originally published at scrapers.lat

How to give Claude a Singapore company-verification (KYB) tool with the Apify MCP server

AI agents are good at reasoning and terrible at facts. Ask Claude whether "DBS Bank" is a real, active company in Singapore, when it was incorporated, and what its official business identifier is, and it will give you a confident answer from its training data that may be months or years stale, or simply wrong. For anything compliance-related, "probably correct" is not good enough.

In this guide we fix that. We connect Claude to the official Apify MCP server, expose a single Actor that reads the Singapore ACRA corporate register, and turn "is this company real?" from a guess into a live lookup against the source of record. By the end you will have a working KYB (know-your-business) tool that Claude, Cursor, or any MCP client can call during a conversation, and you will understand exactly where in the run the tool fires and what it returns.

Everything below is a real setup with real output. No mocked responses.

What is the Apify MCP server?

Model Context Protocol (MCP) is an open standard that lets AI clients call external tools. The Apify MCP server (https://mcp.apify.com) implements that standard on top of the Apify platform, which means every one of the thousands of Actors in the Apify Store becomes a tool an agent can invoke.

Why route an Actor through MCP instead of hard-coding an API call?

  • The agent decides when to fetch. Claude reads the conversation, notices it needs a fact it does not have, and calls the tool on its own. You do not write glue code for every question.
  • Structured input and output. The MCP server hands Claude the Actor's input schema, so the model fills in the parameters correctly, and returns a clean dataset it can reason over.
  • One connection, many tools. The same MCP endpoint exposes search-actors, fetch-actor-details, and call-actor, so an agent can discover and run any Actor without new configuration.
  • No infrastructure. The server is hosted. You add a few lines to a config file and you are done.

The Actor we will use

We will expose the Singapore ACRA Company Registry Scraper. It searches Singapore's official corporate register maintained by the Accounting and Corporate Regulatory Authority (ACRA) and returns the full registry record for a company: legal entity name, UEN, entity status (live/struck-off/wound-up), entity and company type, incorporation date, registered address, primary business activity (SSIC) code, number of officers, and the latest annual return date.

That field set is exactly what a KYB or vendor-onboarding check on a Singapore counterparty needs. Singapore is a useful jurisdiction because ACRA is the authoritative, government-maintained source of record for every registered entity in the country.

The Singapore ACRA Company Registry Scraper on the Apify Store

A quick word on the most important field. The UEN (Unique Entity Number) is Singapore's official business identifier, a single code that every registered entity is assigned for its entire life. It is the equivalent of a company registration number: it never changes, it is unambiguous even when two firms share a similar name, and it is the value you put on a contract, an invoice, and a KYC file. When you verify a Singapore counterparty, the UEN is the one field you must capture.

Step 1: Get your Apify API token

Sign in to the Apify Console, open Settings → Integrations, and copy your personal API token. The MCP server uses it to authenticate and to bill Actor runs to your account.

📌 Note: the token is a secret. Keep it in the client config only, never in a prompt or a committed file.

Step 2: Point Claude Desktop at the Apify MCP server

Open Claude Desktop's config file (Settings → Developer → Edit Config, or ~/Library/Application Support/Claude/claude_desktop_config.json on macOS) and add the Apify server. The tools query parameter is the important part: it tells the server which Actor to expose, so Claude gets one focused tool instead of the entire Store.

{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=scrapers_lat/singapore-acra-entities-scraper",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Cursor uses the same JSON in .cursor/mcp.json. If you prefer to run it locally over stdio instead of the hosted endpoint:

{
  "mcpServers": {
    "apify": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server", "--tools", "scrapers_lat/singapore-acra-entities-scraper"],
      "env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Restart Claude Desktop so it picks up the new server.

Step 3: Confirm the tool is loaded

After the restart, the Actor shows up as a callable tool. If you list the tools the Apify server exposes, you will see the storage helpers plus the Actor itself, named after its Store handle:

get-actor-run, get-dataset-items, get-key-value-store-record,
abort-actor-run, scrapers_lat--singapore-acra-entities-scraper
Enter fullscreen mode Exit fullscreen mode

That last entry, scrapers_lat--singapore-acra-entities-scraper, is our KYB tool. Claude now knows it exists, what it does (from the Actor's README), and what inputs it takes (from the input schema the server passes along).

Step 4: Ask Claude to verify a company

Now the payoff. In a normal chat, ask a question that requires ground truth:

"Is DBS Bank a registered, active company in Singapore? What is its UEN and when was it incorporated?"

Claude recognizes it cannot answer this reliably from memory, selects the ACRA tool, and fills in the input from your question. Under the hood the client sends a tools/call with the Actor's parameters:

{
  "name": "scrapers_lat--singapore-acra-entities-scraper",
  "arguments": {
    "searchQuery": "DBS Bank",
    "maxCompanies": 5
  }
}
Enter fullscreen mode Exit fullscreen mode

The Apify MCP server starts the Actor, waits for it to finish, and returns the dataset. Here is the real run metadata it produced:

{
  "runId": "akGWxgAlSrRRZyKga",
  "actorName": "scrapers_lat/singapore-acra-entities-scraper",
  "status": "SUCCEEDED"
}
Enter fullscreen mode Exit fullscreen mode

A live lookup against the ACRA register, resolved in-chat.

Step 5: Read the real output

The dataset the tool returns is structured registry data. This is an actual record from the run (trimmed to the fields that matter for KYB):

{
  "uen": "196800306E",
  "entityName": "DBS BANK LTD.",
  "entityStatus": "Live Company",
  "entityType": "Local Company",
  "companyType": "Public Company Limited by Shares",
  "registrationIncorporationDate": "1968-07-16",
  "entityAgeYears": 58,
  "address": "12, MARINA BOULEVARD, MARINA BAY FINANCIAL CENTRE, Singapore 018982",
  "primarySsicCode": "64120",
  "noOfOfficers": 102,
  "annualReturnDate": "2026-06-03"
}
Enter fullscreen mode Exit fullscreen mode

Claude reads that and answers in plain language: yes, the entity DBS BANK LTD. is a Live Company, its UEN is 196800306E, it was incorporated on 16 July 1968 (making it 58 years old), it is a Public Company Limited by Shares registered at 12 Marina Boulevard, and it filed its most recent annual return on 3 June 2026. Every one of those facts is traceable to the official ACRA record, not the model's memory.

Claude verifying a Singapore company on the ACRA register and returning its UEN and status

The status field is what makes this a compliance tool rather than a search box. ACRA marks entities as Live Company, Struck Off, In Liquidation, or Wound Up, among other states. A name match alone tells you nothing; the status tells you whether you are looking at a going concern or a dead shell. An agent doing due diligence needs to surface that distinction, and this tool does.

A real use case: a Singapore vendor onboarding agent

Put this in context. A B2B operations or compliance lead is onboarding a new Singapore vendor and needs to confirm, before signing, that:

  1. the legal entity exists and is a Live Company,
  2. the correct UEN is captured for the contract and for invoicing, and
  3. the entity is not struck-off, wound-up, or in liquidation.

Without a tool, the analyst opens the ACRA portal, types the name, clicks into the record, and copies fields into a form, once per vendor. With the tool wired into Claude, the analyst pastes the vendor name into the chat and asks the agent to verify it. Claude calls the Actor, confirms the entity is a Live Company, returns the UEN, status, and incorporation date as evidence, and flags immediately if the counterparty shows any struck-off or wound-up status. The manual portal lookup disappears; the judgment stays with the human.

Concretely: the agent confirms "DBS BANK LTD." is live, hands back UEN 196800306E to paste onto the master service agreement and the invoicing profile, and notes the incorporation date so the onboarding file carries a verifiable, dated citation instead of a name someone typed from an email signature. This is the shape of every good agent tool: it removes the mechanical fetch, not the decision.

Going further: chain a second tool

KYB rarely stops at "does it exist." For a financial counterparty, existence is not enough; you also need to know whether the entity is licensed and regulated. The same MCP connection can expose more Actors by extending the tools parameter:

https://mcp.apify.com?tools=scrapers_lat/singapore-acra-entities-scraper,scrapers_lat/singapore-mas-financial-institutions-scraper
Enter fullscreen mode Exit fullscreen mode

Now the agent can verify the company on the ACRA register and confirm whether it is licensed and regulated by the Monetary Authority of Singapore (MAS) in the same conversation, then combine both results into one risk summary. For a fintech, payments provider, or fund counterparty, that is the difference between "this company is registered" and "this company is registered and holds the licence it claims to hold." Because each Actor is a separate tool, the agent picks the right one for each step on its own.

🏹 Troubleshooting: if the tool does not appear in Claude, the two usual causes are a missing or misspelled Actor handle in the tools parameter (it must be the exact username/actor-name from the Store URL) and a config that was edited while Claude was running. Fix the handle, save, and fully restart the client.

📌 Note: each tool call is a real Actor run billed to your Apify account (this Actor is pay-per-result). For one-off verification the cost is a fraction of a cent; if you plan to check thousands of companies on a schedule, run the Actor directly through the Apify API or a scheduled task instead of one call per chat message.

Wrapping up

You now have an AI agent that can verify a Singapore company against the official ACRA corporate register, on demand, mid-conversation, and hand back the UEN, entity status, and incorporation date a due-diligence check actually needs. The pattern is reusable: pick an Actor that returns authoritative structured data, expose it through the Apify MCP server with the tools parameter, and let the agent decide when to call it.

To take it further:

  • Swap in a different jurisdiction or dataset by changing the Actor handle. The setup is identical.
  • Add the MAS financial-institutions Actor, sanctions screening, or licensing checks to build a multi-step compliance agent for Singapore counterparties.
  • Read the Apify MCP server docs for OAuth setup, resource reads, and the search-actors / call-actor tools that let an agent discover Actors it was not preconfigured with.

The Actor used in this guide: Singapore ACRA Company Registry Scraper.

Top comments (0)