# Handelsregister (remote · register.agentic-firmenbuch.at)

German Handelsregister + Austrian Firmenbuch for AI agents: master data, financials & ratios.

- Trust score: 81/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-22

## Components

- remote · `register.agentic-firmenbuch.at`: 81/100 (this document), [markdown](https://verifymcp.io/servers/jkbngb-handelsregister/register.md), [page](https://verifymcp.io/servers/jkbngb-handelsregister/register)

## Channel facts

- Endpoint: `https://register.agentic-firmenbuch.at/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-22.

- **Endpoint Security**: 74/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 3314 tokens (~301/item across 11 items; 11 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 100/100
  - No destabilizing schema changes in the last 30 days.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 11 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the Handelsregister MCP server?

Handelsregister is a hosted endpoint at https://register.agentic-firmenbuch.at/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http jkbngb-handelsregister 'https://register.agentic-firmenbuch.at/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "jkbngb-handelsregister": {
      "url": "https://register.agentic-firmenbuch.at/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "jkbngb-handelsregister": {
      "type": "http",
      "url": "https://register.agentic-firmenbuch.at/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.jkbngb-handelsregister]
url = "https://register.agentic-firmenbuch.at/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "jkbngb-handelsregister": {
      "type": "remote",
      "url": "https://register.agentic-firmenbuch.at/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add jkbngb-handelsregister --url 'https://register.agentic-firmenbuch.at/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  jkbngb-handelsregister:
    url: "https://register.agentic-firmenbuch.at/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "jkbngb-handelsregister": {
      "Transport": "http",
      "Url": "https://register.agentic-firmenbuch.at/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add jkbngb-handelsregister -t streamable-http -u 'https://register.agentic-firmenbuch.at/mcp'
```

### Other

```json
{
  "mcpServers": {
    "jkbngb-handelsregister": {
      "type": "http",
      "url": "https://register.agentic-firmenbuch.at/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-22 (score 81, +1)

- [security] Stability: 0.97 → pass

### 2026-09-20 (score 80, +1)

No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 79, +1)

No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-15 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-13 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 67 to 70. That category is still filling its 30-day observation window: 20 days of observed history at the previous scan, 21 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-09 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-07 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (11)

### `ping` (~137 tokens)

Liveness / server info

Liveness probe: confirms the unified register server is up. Read-only.

        Parameters:
        - check_backends (optional, default false): when true, additionally performs a
          cheap connection handshake against every configured country backend and reports
          per-country reachability ("ok" / "unreachable").

        Returns {status, server, countries, provenance} - countries maps each configured
        country code to its backend product name and, with check_backends, its live
        reachability. Use get_coverage for data completeness; this tool only says whether
        the service is up.

Input parameters:

- `check_backends` (boolean)

### `get_coverage` (~236 tokens)

Dataset coverage per country

Dataset coverage and the capability matrix, per country. Read-only.
        CALL THIS FIRST before concluding that something does not exist in a country.

        Parameters:
        - country (optional, default "all"): "AT" | "DE" | "all" - which countries to include.

        Returns {countries: {<code>: <that backend's coverage payload>}, capabilities,
        countries_unavailable}. Each country section is the country backend's own coverage
        dashboard (AT: parsed-financials counts by format/status; DE: per-Bundesland counts
        + fill rates - the DE backfill is still running, so a low count means "not crawled
        yet", not "does not exist"). ``capabilities`` is the machine-readable matrix of what
        each country supports (financials, documents, events windows, filters); a country
        that cannot be reached appears under ``countries_unavailable`` with the error
        instead of failing the whole call. For valid filter values use describe_fields;
        for per-company data use search_companies.

Input parameters:

- `country` (string)

### `describe_fields` (~227 tokens)

Describe fields & capabilities

Schema self-description: the unified id scheme, which filters exist, which
        countries support which capability, and each country's own field catalog. Read-only.

        Parameters:
        - country (optional, default "all"): "AT" | "DE" | "all" - whose field catalogs to
          include.

        Returns {id_scheme, capabilities, countries, countries_unavailable}. ``id_scheme``
        documents the unified company_id ("AT:123456a", "DE:D2601_HRB135076"; bare national
        ids are accepted, responses always return the prefixed form). ``capabilities`` is
        the per-country capability matrix including each country's supported unified
        filters - a filter absent for a country is applied to the others and reported in a
        notice, never silently dropped. ``countries`` carries each backend's own
        describe_fields payload (code tables, null rules, tool tiers). Call once up front
        when unsure which filter or tool to use; it returns no company data itself.

Input parameters:

- `country` (string)

### `search_companies` (~781 tokens)

Search companies (AT + DE)

Find companies across the Austrian Firmenbuch and the German Handelsregister -
        START HERE for any company lookup. Read-only.

        Parameters:
        - filters (optional): every field optional, AND-combined. Shared core (both
          countries): name (substring), query (MEANING-based hybrid search over the
          registered purpose - both countries), status (active|inactive|all, default all),
          legal_form, bundesland, city, postal_code (prefix; AT PLZ 4-digit, DE 5-digit),
          near {place | postal_code, radius_km} (radius search, matches from EVERY queried
          country within the radius - works across the border), nace_section (A-U; OENACE
          == WZ == NACE Rev. 2, so one industry code filters both countries), gegenstand
          (literal substring over the registered activity text), manager_name (person
          search), company_ids (prefixed watchlist, e.g. ["AT:123456a",
          "DE:D2601_HRB135076"], max 100). AT-only today (see describe_fields
          capabilities): nace_division/group, size_gkl, bilanzsumme/revenue/equity_ratio/
          employees ranges, growth_profile, has_guv(_latest), last_filing_year_min,
          founded_year_min/max, gf_age_min, event_signal/since/until. DE-only:
          registergericht, capital_min/max (Stammkapital). Country aliases
          (geschaeftszweig, oenace_*, wz_section, fnrs, stammkapital_*) are accepted.
        - sort (optional): {field, descending}. AT fields: bilanzsumme (default), revenue,
          equity_ratio, employees, last_filing_year, revenue_growth_1y/3y/5y, distance.
          DE fields: name, register_nummer, capital. A country that cannot sort by the
          requested field returns its default order (reported in notices).
        - page (default 1), page_size (default 25).
        - after (optional): KEYSET paging for bulk extraction - single country only
          (cursors are per register). Pass "" to start, then the country's next_after
          fro…

Input parameters:

- `after`
- `country` (string)
- `exact_count` (boolean)
- `filters`
- `page` (integer)
- `page_size` (integer)
- `sort`

### `get_company_details` (~266 tokens)

Company profile (AT + DE)

Full profile for ONE company, routed by its unified id. Read-only.

        Parameters:
        - company_id (required): "AT:{fnr}" (e.g. "AT:123456a") or
          "DE:{court}_{type}{number}" (e.g. "DE:D2601_HRB135076"); bare national ids are
          accepted too. Take it from a search card's ``company_id``.
        - max_signatories (optional, DE only): cap on the served officer list (DE default
          15, 0 = all); ignored for AT.

        Returns the country backend's full profile plus ``country`` and the prefixed
        ``company_id``. AT: identity, location, per-year Bilanz + GuV, ratios, growth,
        filings, management, events. DE: identity, seat, Stammkapital, Gegenstand, WZ/NACE
        classification, managing directors (birth year only) - German financial statements
        are not covered yet, so never report them as zero or missing. Unknown id ->
        {error: not_found}. Use search_companies first when you only have a name.

Input parameters:

- `company_id` (string, required)
- `max_signatories`

### `export_companies_csv` (~273 tokens)

Export companies to CSV (AT + DE)

Export a matched company set as downloadable CSV files (lead lists). Read-only
        over company data; each call writes new short-lived export files (auto-deleted
        after ~1 day).

        Parameters:
        - filters (optional): EXACTLY the same unified filters as search_companies.
        - sort (optional): same as search_companies (applies where the country supports
          the field).
        - max_rows (optional, default 1000, max 10000): per-country row ceiling.
        - country (optional, default "all"): "AT" | "DE" | "all".

        Returns {countries: {<code>: {download_url, rows, columns, ...}}, notices}. ONE
        CSV per country (semicolon-separated, UTF-8 BOM, Excel-ready): each register
        exports its own column set - DE files have no financial columns yet (blank would
        wrongly read as zero). Download links are signed and valid ~60 minutes. A filter a
        country does not support excludes that country with a notice, like
        search_companies. For browsing/ranking on screen use search_companies instead.

Input parameters:

- `country` (string)
- `filters`
- `max_rows` (integer)
- `sort`

### `find_peers` (~299 tokens)

Find peer companies (incl. cross-border)

Companies most similar to a given one - optionally ACROSS THE BORDER. Read-only.

        Parameters:
        - company_id (required): "AT:{fnr}" or "DE:{court}_{type}{number}" (bare national
          ids accepted), from a search card.
        - n (optional, default 10): how many peers per country.
        - cross_border (optional, default false): when true, additionally returns
          ``peers_abroad`` - the companies in the OTHER country whose registered purpose
          is semantically closest to the reference company's activity text.

        Returns {company_id, country, peers_home, home_envelope, peers_abroad?, notes}.
        ``peers_home`` uses the home register's own peer logic (AT: same size class,
        same industry preferred, nearest by Bilanzsumme; DE: semantic-first by registered
        purpose). ``peers_abroad`` is a MEANING-based match, not a size or financial
        benchmark - the honest cross-border comparison given the countries' different
        data depth (see notes). Empty peers_home means the id is unknown or the company
        lacks the data its register ranks by. For a strict filtered list use
        search_companies; for aggregates use the country server's cohort tools.

Input parameters:

- `company_id` (string, required)
- `cross_border` (boolean)
- `n` (integer)

### `search_person` (~276 tokens)

Search a person across registers

Find every company a person runs or represents - across BOTH registers in one
        call (cross-border person search). Read-only.

        Parameters:
        - name (required): person name substring, case-insensitive, e.g. "Mustermann".
        - country (optional, default "all"): "AT" | "DE" | "all".
        - page_size (optional, default 25): results per country.
        - status (optional, default "all"): "active" | "inactive" | "all".

        Returns the merged search_companies envelope ({countries, results, per_country,
        notices}) plus ``person_query``; every result card carries ``country``,
        ``company_id`` and the matched manager. AT matches the primary managing director,
        DE matches all managing directors AND registered signatories. IMPORTANT: matching
        is by name and the registers publish birth YEAR only - a shared name across
        companies or countries does not prove the same person (the notice says so; use
        birth years and context to corroborate). For general company search use
        search_companies with other filters; manager_name can be combined there too.

Input parameters:

- `country` (string)
- `name` (string, required)
- `page_size` (integer)
- `status` (string)

### `list_events` (~492 tokens)

Register change feed (AT + DE)

Cross-company, cross-country feed of register CHANGES, newest first - the
        market-watch / deal-sourcing surface. Read-only.

        Parameters (all optional, AND-combined):
        - types: any of the SUPERSET enum - founding, new_registration, deletion,
          deletion_announced, name_change, seat_change, legal_form_change, capital_change,
          management_change, management_join, management_leave, gegenstand_change, merger,
          split, conversion, contribution, consolidation, division,
          shareholder_capital_change. Each country's feed carries a SUBSET; a type not in
          a country's feed is skipped for that country (reported in notices), and a
          country with none of the requested types is excluded. Note new_registration (DE,
          a discovery date) and founding (AT, a register event) are distinct - see
          describe_fields.
        - since / until: ISO dates. Default window: last 30 days.
        - bundesland: full state name.
        - nace_section (A-U, both countries); nace_division (AT only); legal_form (AT only).
        - company_ids: prefixed watchlist; AT filters the whole list, DE filters ONE id at
          a time (pass a single DE id, or query DE separately).
        - country: "AT" | "DE" | "all" (default). page (1), page_size (25).

        Returns {countries, events, per_country, windows, notices}. ``events`` are merged
        newest-first, each with ``country`` and a prefixed ``company_id``; AT events add
        before/after values only for the detailed types. ``windows`` states each country's
        data availability (AT: detailed >= 2026-07-01, coarse >= ~2020; DE: >= 2026-07-30)
        so an empty stretch is never mistaken for missing data. For aggregate counts use
        get_event_stats; for one company's history use get_company_details.

Input parameters:

- `bundesland`
- `company_ids`
- `country` (string)
- `legal_form`
- `nace_division`
- `nace_section`
- `page` (integer)
- `page_size` (integer)
- `since`
- `types`
- `until`

### `get_event_stats` (~178 tokens)

Register change statistics

Aggregate counts of register changes by type and region, per country. Read-only.

        Parameters (all optional): since / until (default last 30 days); bundesland;
        nace_section; nace_division (AT); legal_form (AT); country ("AT" | "DE" | "all").

        Returns {countries, per_country, windows, notices}, each country's block being its
        own {total, by_type, by_bundesland}. Only AT exposes event statistics today; DE is
        reported in notices as not yet available (never as zero). For the individual
        changes use list_events.

Input parameters:

- `bundesland`
- `country` (string)
- `legal_form`
- `nace_division`
- `nace_section`
- `since`
- `until`

### `get_my_usage` (~149 tokens)

My API usage

Your own API-key usage across both registers: call count and weighted
        compute-units, per tool. Read-only.

        Parameters:
        - window (optional, default "today"): "today" | "yesterday" | "month_to_date" |
          "last_30_days" | "all".

        Returns only the calling key's own usage (totals + per-tool breakdown) for that
        window - never another user's data and never the email behind the key. One meter
        spans AT and DE, since the facade is the single billing point. Use it to check your
        consumption against the plan's rate limits.

Input parameters:

- `window` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/jkbngb-handelsregister/register#diagnostics

## Score history

- 2026-09-22: 81
- 2026-09-21: 80
- 2026-09-20: 80
- 2026-09-19: 79
- 2026-09-18: 79
- 2026-09-17: 78
- 2026-09-16: 78
- 2026-09-15: 78
- 2026-09-14: 77
- 2026-09-13: 77
- 2026-09-12: 76
- 2026-09-11: 76
- 2026-09-10: 75
- 2026-09-09: 75
- 2026-09-08: 74
- 2026-09-07: 74
- 2026-09-06: 73
- 2026-09-05: 73
- 2026-09-04: 72
- 2026-09-03: 72
- 2026-09-02: 71
- 2026-09-01: 71
- 2026-08-31: 71
- 2026-08-30: 70
- 2026-08-29: 70
- 2026-08-28: 69
- 2026-08-27: 69
- 2026-08-26: 68
- 2026-08-25: 66
- 2026-08-24: 65

## Common questions

### What is the Handelsregister MCP server?

Handelsregister is an MCP server listed in the public MCP registry as io.github.jkbngb/handelsregister. German Handelsregister + Austrian Firmenbuch for AI agents: master data, financials & ratios. This page covers its hosted endpoint (https://register.agentic-firmenbuch.at/mcp).

### Is the Handelsregister MCP server safe to use?

Handelsregister scores 81 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Handelsregister MCP server expose?

Handelsregister exposes 11 tools: ping, get_coverage, describe_fields, search_companies, get_company_details, and 6 more. Their descriptions and schemas cost roughly 3,314 tokens of context every time the server is loaded.

### Does the Handelsregister MCP server require authentication?

No. We connected to Handelsregister without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Handelsregister MCP server still maintained?

Handelsregister is still listed as active in the MCP registry. We last reached this channel on 22 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://register.agentic-firmenbuch.at/mcp
- Repository: https://github.com/jkbngb/agentic-firmenbuch
- Changelog RSS feed: https://verifymcp.io/servers/jkbngb-handelsregister/register.xml
- Changelog JSON feed: https://verifymcp.io/servers/jkbngb-handelsregister/register.json
- HTML version of this page: https://verifymcp.io/servers/jkbngb-handelsregister/register
