Skip to main content
Glama
mcp-server-zefix

mcp-server-zefix

by johnphilipp

mcp-server-zefix

Look up any Swiss company directly from Claude.

PyPI License: MIT Tests

An MCP server that connects Claude to Zefix, Switzerland's official company register (Handelsregister). Zefix is operated by the Federal Office of Justice and provides authoritative data from all 26 cantonal commercial registers -- company details, legal forms, audit firms, corporate history, and official gazette publications.

What you can ask

  • "Search for Novartis on Zefix"

  • "Find all foundations in Basel"

  • "Who audits Novartis AG?"

  • "What companies has Novartis taken over?"

  • "Show me all branches of KIBAG Bauleistungen AG"

  • "Get the corporate structure for CHE-467.005.033"

  • "Show me the corporate history of Huber Baustoffe AG"

  • "What capital changes has cohaga AG had recently?"

  • "Find all GmbHs in Zurich"

  • "List all Swiss legal forms in German"

Related MCP server: Zefix MCP

Quick Start

Hosted (no installation)

Connect directly -- no API key, no credentials, just the URL.

Claude.ai:

Settings > Customize > Connectors > Add custom connector:

  • URL: https://mcp-server-zefix.contextfor.ai/mcp

Claude Code:

claude mcp add --transport http zefix https://mcp-server-zefix.contextfor.ai/mcp

Local

claude mcp add zefix -- uvx mcp-server-zefix

Or add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "zefix": {
      "command": "uvx",
      "args": ["mcp-server-zefix"]
    }
  }
}

Tools

Tool

Description

search_companies

Search by name (wildcards supported), filter by canton and legal form

get_company_by_uid

Full company profile: address, purpose, audit firm, takeover history, branch offices, previous names

get_company_by_chid

Same as above, using the CH-ID identifier

get_company_structure

Head office and all branch offices in a table with full addresses. Works from any branch UID.

get_company_publications

SHAB timeline: board changes, capital changes, mergers, address changes, and more

list_legal_forms

All Swiss legal forms (AG, GmbH, Stiftung, etc.) with IDs for filtering

All tools accept a language parameter (de, fr, it, en). Output labels use official Zefix terminology in the selected language.

What you get

A company lookup returns:

  • Identifiers -- name, UID, CH-ID, status, legal form

  • Location -- registered office, full address

  • Purpose -- the company's stated business purpose

  • Audit firm -- name and UID of the auditor

  • Corporate history -- companies absorbed, acquisitions, previous names

  • Corporate structure -- head office and all branch offices with addresses, displayed as a table

  • Branch offices -- all registered branch locations

  • SHAB publications -- timeline of legally significant events from the Swiss Official Gazette (board changes, capital changes, mergers, purpose changes)

  • Cantonal register link -- direct link to the full excerpt with board members and signatories

Configuration

Works with zero configuration using the public Zefix API. For the official authenticated API, set these environment variables:

Variable

Default

Description

ZEFIX_BASE_URL

https://www.zefix.ch/ZefixREST/api/v1

API base URL

ZEFIX_USERNAME

(none)

Username for ZefixPublicREST API

ZEFIX_PASSWORD

(none)

Password for ZefixPublicREST API

To use the official API, request credentials from zefix@bj.admin.ch, then:

{
  "mcpServers": {
    "zefix": {
      "command": "uvx",
      "args": ["mcp-server-zefix"],
      "env": {
        "ZEFIX_BASE_URL": "https://www.zefix.admin.ch/ZefixPublicREST/api/v1",
        "ZEFIX_USERNAME": "your-username",
        "ZEFIX_PASSWORD": "your-password"
      }
    }
  }
}

Development

git clone https://github.com/johnphilipp/mcp-server-zefix.git
cd mcp-server-zefix
uv sync --all-extras

uv run ruff check .           # lint
uv run pytest tests/ -v       # test (68 tests, all use fakes, no network)
npx @modelcontextprotocol/inspector uv --directory . run mcp-server-zefix  # interactive

Architecture

Follows Architecture Patterns with Python (Percival & Gregory):

  • Domain models (models.py) -- frozen dataclasses (Company, LegalForm, ShabPublication), domain exceptions, no infrastructure imports

  • Port + adapter (zefix_client.py) -- AbstractZefixClient protocol; HttpZefixClient translates HTTP to domain objects and httpx exceptions to domain exceptions

  • Service layer (server.py) -- handle_* functions accept the abstract client, never import httpx

  • Localization (i18n.py) -- centralized label translations (de/fr/it/en) using official Zefix terminology

  • Fakes over mocks -- tests use FakeZefixClient, a working in-memory implementation; test files never import httpx

Self-hosting

The server supports remote deployment via Streamable HTTP transport. See Dockerfile, docker-compose.prod.yml, and Caddyfile for a Docker + Caddy setup with auto-HTTPS.

License

MIT

Available Tools

6 tools
get_company_by_chidA
Read-only

Get detailed information about a Swiss company by its CH-ID.

The CH-ID is an alternative identifier used in the Swiss commercial
register system.

Args:
    chid: The CH-ID identifier (e.g. CH27030000714).
    language: Response language (de, fr, it, en).

Inputs: chid (required), language. Returns: result

get_company_by_uidA
Read-only

Get detailed information about a Swiss company by its UID number.

The UID (Unternehmens-Identifikationsnummer) is the unique identifier
for Swiss companies. Accepts various formats like CHE-123.456.789,
CHE123456789, or just 123456789.

Args:
    uid: Company UID in any format (e.g. CHE-123.456.789 or CHE123456789).
    language: Response language (de, fr, it, en).

Inputs: uid (required), language. Returns: result

get_company_publicationsA
Read-only

Get SHAB publications (Swiss Official Gazette) for a company.

Returns a timeline of legally significant events: board changes,
capital changes, mergers, address changes, purpose changes, etc.

Args:
    uid: Company UID in any format (e.g. CHE-123.456.789 or CHE123456789).
    language: Response language (de, fr, it, en).

Inputs: uid (required), language. Returns: result

get_company_structureA
Read-only

Get the corporate structure (head office and branches) of a Swiss company.

Shows the parent company (Hauptniederlassung) and all its branch offices
(Zweigniederlassungen) in a table with full addresses. Works whether you
pass the UID of the head office or any branch — the full structure is
returned either way.

Fetches detail for up to 50 branches. May take a while for large
structures since each branch requires a separate API call.

Args:
    uid: Company UID in any format (e.g. CHE-105.807.648 or CHE123456789).
    language: Response language (de, fr, it, en).

Inputs: uid (required), language. Returns: result

search_companiesA
Read-only

Search Swiss companies in the Zefix register by name.

Use * as wildcard (e.g. "Novartis*" or "*pharma*"). Returns a list of
matching companies with UID, legal form, and registered office.

Args:
    name: Company name to search for. Supports * wildcard.
    canton: Two-letter canton code (e.g. ZH, BE, GE). Empty for all.
    active_only: If true, only return currently active companies.
    language: Response language (de, fr, it, en).
    max_results: Maximum number of results to return (1-500).
    offset: Pagination offset for retrieving additional results.
    legal_form_ids: Comma-separated legal form IDs (e.g. "3,4").

Inputs: name (required), canton, offset, language, +3 more. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 6 tools

    Disambiguation4/5

    The tools are mostly distinct, but get_company_by_uid and get_company_by_chid both retrieve detailed company info and could be confused. However, the descriptions clearly differentiate them by identifier type, and search/list tools are unambiguous.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern (search, get, list) with snake_case throughout. The two get_company_by_* variants are uniformly structured.

    Tool Count5/5

    Six tools is an appropriate scope for a Swiss company register server, covering search, lookup, and ancillary data without redundancy or bloat.

    Completeness4/5

    The tool set covers the core functionality of the Zefix register: search, details by identifier, legal forms, publications, and corporate structure. Minor gaps exist (e.g., no direct address lookup or historical searches), but nothing critical for the apparent domain.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      Not graded
      maintenance
      The most comprehensive signal intelligence on Swiss businesses — 800K+ companies with people, FINMA/SRO regulatory data, building permits, procurement tenders, and AI-enriched profiles from the official commercial register.
      -
    • A
      license
      B
      quality
      D
      maintenance
      Enables AI assistants to search the Swiss Central Business Name Index (Zefix) for companies by name or UID, with optional filters, and retrieve full company details including address, legal form, history, and representatives.
      1
      30 npm
      5
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Provides access to the Swiss Federal Commercial Register (Zefix) for company search, verification, and reference data, enabling natural language queries for public administration use cases.
      9
      40 PyPI
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables AI agents to search and retrieve structured data from the German Commercial Register, including company details, filed documents, and shareholder lists.
      7
      5
      Apache 2.0