Skip to main content
Glama
johnphilipp

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: SwissRegister

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
chidYes
languageNoen

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the description does not need to restate safety. It adds useful context about the CH-ID concept and language options, but does not disclose additional behavioral traits such as error handling, response format, or edge cases, so transparency is adequate but not enhanced beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, starting with the main purpose, then a brief explanatory note about CH-ID, and an Args list. It avoids fluff and is easy to scan, though the Args section partially duplicates schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and clear annotations, the description provides enough context for correct invocation. It explains the unique identifier and language parameter. The only missing piece is explicit guidance on when to use this tool vs. sibling tools, but that is a minor gap given the overall simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only field names and types, but the description's Args section explains both parameters with real-world examples (e.g., CH27030000714) and lists acceptable language values (de, fr, it, en). This significantly compensates for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get detailed information about a Swiss company by its CH-ID', which is a specific verb+resource+identifier pattern. It clearly distinguishes from sibling tools like get_company_by_uid by explicitly naming the CH-ID as the lookup key.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when a CH-ID is available, and explains that CH-ID is an alternative identifier. However, it does not explicitly mention when to prefer this tool over alternatives (e.g., get_company_by_uid) or any exclusions, so guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
languageNoen

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds useful input format flexibility (accepts various UID formats) and language options, but does not disclose additional behavioral traits like data freshness, rate limits, or output structure. Annotations already indicate read-only safety, so the bar is lower; this scores as adequate but not outstanding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear purpose, an explanatory note about UID, and an Args section. It is slightly longer than necessary but every sentence serves a purpose, especially given the lack of schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple lookup tool with an output schema present, the description sufficiently covers purpose, parameters, input formats, and language. It does not explain return values, but the output schema presumably does. It is complete for the tool's complexity, though could mention when to prefer sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It fully explains both parameters: uid (with examples of accepted formats) and language (with allowed values de, fr, it, en). This goes well beyond the schema's simple type definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and resource 'detailed information about a Swiss company by its UID number,' which distinguishes it from siblings like get_company_by_chid and search_companies. The specificity of UID-based lookup makes the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when you have a UID, but it does not explicitly mention alternatives or when not to use this tool. It lacks a clear 'use search_companies if you don't have a UID' or similar guidance, so the usage is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
languageNoen

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint. The description adds context about the timeline of events (board changes, capital changes, mergers, etc.), but does not disclose rate limits, auth, or pagination. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise and front-loaded with the main purpose. The args section clearly lists parameters with useful details, every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter read-only tool with an output schema, the description is complete. It explains what events are included and provides parameter syntax, making it sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has no property descriptions (0% coverage). The description fully compensates by explaining both parameters: uid format with examples, and language options with valid values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Get SHAB publications (Swiss Official Gazette) for a company' with a specific verb and resource. It distinguishes from sibling tools like search_companies and get_company_by_uid by focusing on publications timeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving legally significant events for a company, but does not explicitly state when to use this over alternatives or provide exclusions. Context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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).
ParametersJSON Schema
NameRequiredDescriptionDefault
uidYes
languageNoen

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description reveals key behavioral traits: the output is a table with full addresses, the tool works with either UID type, it fetches up to 50 branches, and performance may be slow due to per-branch API calls. This adds substantial operational context that annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded, with the purpose stated in the first sentence. Subsequent sentences add necessary operational details without redundancy, making every sentence meaningful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with moderate complexity: it covers input semantics, output format (table with addresses), branch limit, and performance characteristics. The presence of an output schema means return-value details are not needed, and the description provides sufficient context for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero schema description coverage, the description fully compensates by explaining the uid format with concrete examples and listing the allowed language values (de, fr, it, en). This gives practical guidance beyond the bare schema properties.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves the corporate structure (head office and branches) of a Swiss company, with specific behavior for head office or branch UIDs. This distinguishes it from sibling tools like get_company_by_uid by focusing on the full organizational hierarchy.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case: when you need the full structure with addresses, not just a single company record. It states that both head office and branch UIDs are accepted, clarifying when it can be used. However, it does not explicitly mention alternatives or when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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").
ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
cantonNo
offsetNo
languageNoen
active_onlyNo
max_resultsNo
legal_form_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, establishing the safe read-only nature. The description adds valuable behavioral context: wildcard support, the list of returned fields (UID, legal form, registered office), pagination via offset, and language selection. This extends beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact (~100 words), opens with the core purpose in the first sentence, and then uses a neatly formatted args list. Every sentence adds operational value, with no filler or redundant statements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

All 7 parameters are described, the search behavior (wildcards, filters) is clear, and the return format is summarized (list with UID, legal form, office). An output schema exists, so deep return-value documentation is unnecessary. The tool's moderate complexity is fully covered by the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining every parameter: name with wildcard, canton as two-letter code, active_only filter, language choices, max_results range, offset for pagination, and legal_form_ids as comma-separated values. This turns an otherwise opaque schema into a usable interface.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the primary function: 'Search Swiss companies in the Zefix register by name.' This is a specific verb (Search) with a well-defined resource (Swiss companies in Zefix register) and method (by name), effectively distinguishing it from sibling tools that focus on exact identifier lookups (get_company_by_uid, get_company_by_chid) or static lists (list_legal_forms).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains how to use the tool (e.g., wildcard syntax, parameter options) but does not explicitly state when to prefer this tool over alternatives. There is no mention of 'use get_company_by_uid for exact matches' or similar exclusions. The use case is implied by the name-based search focus, but not directly articulated as a decision guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 6 tool updatesv0.4.0
    • First observedget_company_by_chid
    • First observedget_company_by_uid
    • First observedget_company_publications
    • First observedget_company_structure
    • First observedlist_legal_forms
    • First observedsearch_companies

TDQS

A4.2/5.0
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

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables searching and retrieving detailed information about Swedish companies, including financial data and annual reports from Bolagsverket (Swedish Companies Registration Office), with intelligent caching for fast responses.
    -
  • F
    license
    Not graded
    quality
    C
    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
    B
    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
    23
    5
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    An MCP server for interacting with the Swiss Commercial Register via Zefix REST API and UID Webservice, enabling company search, validation, SOGC publications, and due diligence reports.
    9
    4
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/johnphilipp/mcp-server-zefix'

If you have feedback or need assistance with the MCP directory API, please join our Discord server