vetari

Swiss commercial-register intelligence: Zefix/SHAB companies and publications with AI lead scoring

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeRead-only

What it can do

  • Find Company By Name: Resolves a company name to its UID by searching live against Zefix — not this dataset. Call search_companies first; an empty page there means not in this dataset, not that the co
  • Load Company: Fetches a company from SHAB/Zefix live and ingests it, for a UID get_companies reports as notInDataset — call get_companies first. Returns the same record once loaded; an already-present
  • Find Colocated Companies: The companies sharing one company's address, given its UID: the same physical address, or the same c/o provider — the fiduciary it is domiciled at, matched as mailbox detecti

What data it sees

Do you need an account

No: the server works without sign-in

Swiss commercial-register intelligence: Zefix/SHAB companies and publications with AI lead scoring

How to connect

How to connect vetari to Claude

The server address to paste into Claude settings:

https://vetari--vetari.run.tools

  1. Open Claude (claude.ai or the desktop app).
  2. Go to Settings → Connectors.
  3. Click Add custom connector.
  4. Paste the server address copied below into Remote MCP server URL and click Add.
  5. In a chat, click + → Connectors and switch the new connector on.

Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.

Authorization

After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.

How to connect vetari to ChatGPT

The server address to paste into ChatGPT settings:

https://vetari--vetari.run.tools

  1. Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
  2. Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
  3. Open Settings → Connectors and click Create.
  4. Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
  5. Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
  6. In a new chat open + → Apps/Connectors and enable the connector.

OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.

Authorization

On first use ChatGPT opens the service's sign-in window. Sign in and approve access.

How to connect vetari to Cursor

The server address to paste into Cursor settings:

https://vetari--vetari.run.tools

Fastest: click Open in Cursor below and confirm the prompt.

Manually:

  1. In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
  2. Paste the JSON copied below into ~/.cursor/mcp.json (per project: .cursor/mcp.json in the repo root).
  3. Save the file. The server appears in the MCP list; authorize it there if asked.

Authorization

If the service needs sign-in, an authorize button appears next to the server in the MCP list.

Server tool list (10)

Raw names from tools/list. Only developers need these.

find_company_by_nameResolves a company name to its UID by searching live against Zefix — not this dataset. Call search_companies first; an empty page there means not in this dataset, not that the company doesn't exist, so use this only once that comes back empty. Matches the start of the name (Zefix's own search, "*" wildcard allowed), at least 3 characters; an optional canton narrows it. Returns candidate uid, name, canton, legal form and status only — no AI fields, since the company may not be ingested yet — and names are not unique, so more than one candidate can come back for you to disambiguate before calling load_company with the right UID. matches is an empty list for a real zero; unavailable is set instead when the live register could not be reached. A broad match (e.g. a short or generic name) is capped at100results, with matchesTruncated set — narrow the name or add canton rather than assume completeness.
load_companyFetches a company from SHAB/Zefix live and ingests it, for a UID get_companies reports as notInDataset — call get_companies first. Returns the same record once loaded; an already-present UID returns immediately. If there is nothing to return, loadStatus says why: NOT_IN_REGISTER, IN_PROGRESS/QUEUE_FULL (retry shortly), or SOURCE_UNAVAILABLE. A malformed UID is rejected.
find_colocated_companiesThe companies sharing one company's address, given its UID: the same physical address, or the same c/o provider — the fiduciary it is domiciled at, matched as mailbox detection counts mass domiciliation. You pivot from a UID; a c/o string is never accepted. The subject is left out. Returns UIDs, newest first. basis names the keys it could be pivoted on, so an empty basis means no address and no provider, not that it stands alone.
get_companiesFull detail for one or several companies (1 to 25) by UID: verbatim purpose, all contact fields, full AI block — the second half of a search, without a call per row. An absent vatRegistration means that enrichment has not run. analysisStatus is always present, and ANALYSED does not promise every field — a dissolution or an administrative change runs only part of the pipeline. Answered in the order asked, a repeated UID once. UIDs the dataset lacks come back in notInDataset with a reason pointing at load_company (which fetches one at a time), and any left out because the response filled up come back in omittedForSize, so a short answer always says so. A malformed UID, or one whose check digit contradicts the rest, is rejected instead.
list_company_uids_at_addressAll company UIDs at a physical address. Street and city match exactly (case-insensitive); house number and postal code narrow it. Matches the physical address only, never the c/o line — for a cluster around a shared fiduciary, start from a company and use find_colocated_companies. Newest registration first. Pair with get_companies for detail.
search_companiesSearch Swiss companies of every legal form: name, canton, legal form, industry, location, registration date, capital, discovered contact details, and the AI block (lead/viability score, mailbox-company and dissolution flags, size, confidence tier, buyer profiles, growth signals). Nothing is silently ignored — an unknown closed-set value or a free-text term under 3 characters is rejected — so an empty page is a real zero for this dataset, which holds only companies named in recent SHAB publications; it is not evidence the company doesn't exist in the register at all — try find_company_by_name against the live register instead. Every AI filter matches only analysed companies, so an empty page there means none analysed matched; analysisStatuses says how much was in scope. purpose is the exception and the way to ask what a company does: it searches the register's own purpose clause, which every company has, and the English AI summary together, so an unanalysed company is still found by its own words, and with no sort the most relevant come first. Unscored companies sort last, so pair a score sort with its minimum. Rows carry the filterable fields only — get_companies for the purpose, address, contact data and full AI block.
describe_datasetWhat this dataset covers — call it before concluding something does not exist. Publication date range held, when the fetch last succeeded, company and publication counts, how many companies are analysed and where that begins, and the same per canton. It holds recent SHAB publications plus Zefix history only for the companies those name, so an older unchanged company is absent from a search — not gone: load_company fetches it directly by UID. Only the analysed part is what every AI filter searches.
get_publicationsVerbatim gazette text for one or several publications (1 to 25), by the UUID search_publications returned. In the order asked, a repeated id once. A message runs from hundreds of characters to several kilobytes, so the id count does not bound the response: entries are returned until the text fills it and the rest come back in omittedForSize; unknown ids come back in notInDataset with a reason; a malformed id is rejected instead.
list_mutation_typesEvery valid mutation type with its English description, for the mutationTypes filter in search_publications.
search_publicationsSearch SHAB gazette publications by date (published or journal), mutation type (see list_mutation_types), sub-rubric, canton, the named company's legal form, and/or a list of company UIDs. Unknown closed-set values are rejected, so an empty page is a real zero. Newest first; the order is fixed. Rows say what happened, to whom and when, without the gazette text — read that via get_publications. title is the entry's own headline, and subRubric separates entries from changes and deletions, which is what is left when mutationTypes is UNRESOLVED. Every other company attribute is a question for search_companies. No free-text search over publication bodies.