mcpbeat Sign in

Firmenbuch MCP Server

answering

Firmenbuch is answering right now. Last checked 10 min ago. It exposes 19 tools. Last commit 27 Oct 2026.

Austria's official company register (Firmenbuch) – master data, financials & ratios for AI agents.

Uptime history 91 days of history · worst day 97%
91 days agonow
100.0%
Uptime 24h
91 of 91 checks
19
Tools
read from the server
469 ms
Response time
average over 24h
0
Stars
last commit 27 Oct 2026

What changed 21

Every tool that appeared, vanished or quietly changed what it asks for. Recorded since 27 October 2026. No other catalogue keeps this.

31 Oct 19 tool descriptions were rewritten benchmark_company, describe_fields, export_companies_csv and 16 more
27 Oct 2 tool descriptions were rewritten get_company_details, search_companies

What the code does

We read the source, 5 d ago · tools taken from the live server · rules 995398eba69f

Capabilities

What this server is able to do. For an MCP server this is often the job itself — a terminal server runs commands because that is what it is for. Listed so you know what you are plugging in, not as an accusation.

Runs an external command .grind/grind2.py:167
    cos_key = subprocess.check_output(
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?onload=afTurnstileInit" async defer></script>
      if(rm){ el.innerHTML = mdInline(text); if(done){ done(); } return; }

Is this your server and something here is wrong? Tell us — corrections are free and do not require a plan.

This code can reach further than it looks

We found places where it runs commands, builds paths or queries from values it is given. None of that is a flaw by itself — it becomes one when the code changes, and code changes quietly between releases. We re-read it on every one.

Three servers free · no card

Connect this server

Endpoint below is the one we actually reach during checks — not the one copied from a README. Last verified 10 min ago.

run in your terminal
claude mcp add firmenbuch --transport http https://mcp.agentic-firmenbuch.at/mcp
Settings → Connectors → Add custom connector, then paste this address
https://mcp.agentic-firmenbuch.at/mcp
~/.codex/config.toml
[mcp_servers.firmenbuch]
url = "https://mcp.agentic-firmenbuch.at/mcp"
.cursor/mcp.json
{
  "mcpServers": {
    "firmenbuch": {
      "url": "https://mcp.agentic-firmenbuch.at/mcp"
    }
  }
}
.vscode/mcp.json
{
  "servers": {
    "firmenbuch": {
      "type": "http",
      "url": "https://mcp.agentic-firmenbuch.at/mcp"
    }
  }
}

This endpoint answered with an authorization challenge. The server is running, and it signs you in through your browser: there is no API key to paste.

Available tools 19

Read directly from the server with tools/list, grouped by what they act on. If a tool disappears, we record the date.

company
get_company_details
Beispiel: „Wer führt die Red Bull GmbH und wie hoch ist die Eigenkapitalquote?“ 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), and the parsed Jahresabschluss (Bilanz, ratios, GuV where published) for companies the rollout has reached - ``financials.reporting_status`` says whether figures exist, the source publishes none, or the company has not been processed yet, so never report missing German figures as zero. Unknown id -> {error: not_found}. Use search_companies first when you only have a name.
get_company_history
Beispiel: „Wie hat sich der Umsatz der Rauch Fruchtsäfte GmbH in den letzten fünf Jahren entwickelt?“ Per-year financial-metric history for ONE company, routed by its unified id. Read-only. Parameters: - company_id (required): "AT:{fnr}" or "DE:{court}_{type}{number}" (bare national ids accepted), from a search card. - metrics (optional, AT only): names of the metrics to return (e.g. bilanzsumme, umsatzerloese, equity_ratio); omitted = all. Ignored for DE. Returns the backend's history payload plus ``country`` and the prefixed ``company_id``: per-metric {year: value} with latest/latest_year. AT serves the parsed Bilanz/GuV/ratio series. DE serves the parsed Jahresabschluss series where the company has filed and its Bundesland is loaded; an empty series means not-filed or not-yet- loaded, never zero (see get_company_details financials.reporting_status). For a single snapshot use get_company_details; for the complete record use get_full_record.
document
get_document
Beispiel: „Den aktuellen Handelsregisterauszug der Siemens AG abrufen?“ On-demand official register document for ONE German company. Read-only. Parameters: - company_id (required): "DE:{court}_{type}{number}" (e.g. "DE:D2601_HRB135076"); a bare German id works too. Austria is not supported here (its document flow is different). - kind (optional): "AD" = Aktueller Abdruck (current register extract, default) or "CD" = Chronologischer Abdruck -- the official Handelsregister abstract PDF; or "JA" = Jahresabschluss -- the company's newest official annual financial statement as published by the Unternehmensregister (served as the official HTML document, no PDF exists at the source). Returns a short-lived download link: {company_id, kind, url, bytes, cached, available, source, expires_at, expires_in_seconds} (plus year, stichtag for "JA"). AD/CD are fetched from handelsregister.de on demand (first call ~10 s, then cached); JA is served from the stored official publication. When the register holds nothing for that kind, ``available`` is false with a ``note`` (never a dead link). A non-DE id returns an error.
get_document_text
Beispiel: „Was steht im Lagebericht des letzten Jahresabschlusses?“ Extracted text of ONE Austrian filing document, by its document key. Read-only. Parameters: - doc_key (required): the document_ref from list_documents (an Austrian filing key). - max_chars (optional, default 40000, clamped 1000-120000): truncation ceiling. Returns {doc_key, text, truncated, ...} with the filing's Stichtag for citation. Austria only today. Use list_documents to discover the key; for the German official register abstract use get_document.
benchmark
benchmark_company
Beispiel: „Wo steht die Rauch Fruchtsäfte GmbH im Vergleich zu gleich großen Firmen?“ Benchmark ONE company against its size-class cohort: headline metrics, percentile ranks and the nearest peers. Read-only. Parameters: - company_id (required): "AT:{fnr}" (bare FNR accepted). Austria only (needs parsed financials); a German id returns a clear error. - n (optional, default 10): how many nearest peers to return. Returns the AT backend's benchmark payload plus ``country`` and the prefixed ``company_id``: headline figures, ``percentiles`` within the UGB size class, and the nearest peers with a recency note. For a cross-border meaning-based peer set use find_peers with cross_border=true.
cohort
get_cohort_summary
Beispiel: „Wie groß ist eine typische GmbH in Vorarlberg?“ Aggregate statistics for a cohort of companies, per country. Read-only. Parameters: - dimension (required): "gkl" (UGB size class, AT only), "bundesland", or "legal_form" (alias size_gkl -> gkl). - value (required): the cohort value (e.g. bundesland "Wien", legal_form "GmbH"). - country (optional, default "all"): "AT" | "DE" | "all". Returns {countries, dimension, value, per_country, notices}. ``bundesland`` and ``legal_form`` fan out to every supporting country; ``gkl`` is Austrian-only (no German size-class facet) and excludes DE with a notice. Each country's own cohort payload sits under ``per_country`` (the registers aggregate different metrics, so they are reported side by side, not force-merged). For one company use get_company_details; for a filtered list use search_companies.
companies
search_companies
Beispiel: „Welche aktiven GmbHs in Oberösterreich haben eine Bilanzsumme über 5 Mio. €?“ 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), nace_division/group/class, founded_year_min/max, and the balance-sheet screens size_gkl (AT W/K/M/G or DE kleinst/klein/mittel/ gross, translated per register), bilanzsumme_min/max, equity_ratio_min/max (fraction, 0.35 = 35 %), has_guv, growth_profile - in Germany these match only companies with a parsed Jahresabschluss (rollout per Bundesland, see get_coverage; a notice states the scope). AT-only today (see describe_fields capabilities): revenue/employees ranges, has_guv_latest, last_filing_year_min, 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, bilanzsumme, equity_ratio, revenue (financial sorts rank the companies with figures first). 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 from per_country. - exact_count (optional, default false): force exact totals (costs a full scan). - country (optional, default "all"): "AT" | "DE" | "all". Returns {countries, total: {AT, DE, combined}, results, per_country, notices}. ``results`` are compact cards, each with ``country`` and the prefixed ``company_id``; with country="all" the list is AT block then DE block - each country keeps its own ranking (no fake interleave). ``per_country`` carries each register's own envelope (exact totals or lower bounds, applied_filters, relaxations on zero hits, query_mode, next_after). A filter one country does not support excludes that country and says so in ``notices`` - it is never silently dropped; an unreachable backend appears in ``countries_unavailable`` instead of failing the call. Never report a German company's financials as zero - the German Jahresabschluss rollout is per Bundesland, so a company without figures has not been processed yet or files none (see get_coverage and financials.reporting_status in get_company_details). For one company's full profile use get_company_details; for a downloadable list use export_companies_csv; for dataset completeness use get_coverage.
coverage
get_coverage
Beispiel: „Für welche deutschen Bundesländer liegen Jahresabschlüsse vor?“ 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.
describe
describe_fields
Beispiel: „Welche Felder und Filter gibt es?“ 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.
documents
list_documents
Beispiel: „Welche Urkunden und Jahresabschlüsse liegen zur Red Bull GmbH vor?“ Chronology of a company's filing documents (metadata, newest first). Read-only. Parameters: - company_id (required): "AT:{fnr}" (bare FNR accepted). Austria only; for the German official register abstract use get_document with a "DE:" id instead. Returns the AT backend's document list plus ``country`` and the prefixed ``company_id``: each entry has type, Stichtag, financial_year, document_ref, format and whether it was parsed. Feed a document_ref to get_document_text for the extracted text.
event
get_event_stats
Beispiel: „Wie viele Kapitalerhöhungen gab es seit Jahresbeginn in Tirol?“ 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.
events
list_events
Beispiel: „Welche Firmen in Salzburg hatten im letzten Monat einen Geschäftsführerwechsel?“ 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.
export
export_companies_csv
Beispiel: „Alle Steuerberatungskanzleien in Wien als CSV exportieren?“ 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.
full
get_full_record
Beispiel: „Alle Bilanzpositionen der Red Bull GmbH über alle Jahre?“ The complete multi-year record for ONE company: every balance-sheet and P&L position's full per-year history, completeness flags and lineage. Read-only. The heaviest read - use get_company_details for a normal profile. Parameters: - company_id (required): "AT:{fnr}" (bare FNR accepted). Austria only today; a German id returns a clear error (Germany does not serve a full parsed record yet). Returns the AT backend's full-record payload plus ``country`` and the prefixed ``company_id``. Includes unknown-code passthrough and the filing years covered.
peers
find_peers
Beispiel: „Welche Firmen sind ähnlich groß wie die Rauch Fruchtsäfte GmbH?“ 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.
person
search_person
Beispiel: „Welche Firmen führt eine Person namens Maria Huber?“ 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.
ping
ping
Beispiel: „Ist die Verbindung zum Register aktiv?“ 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.
sectors
list_sectors
Beispiel: „Welcher Branchencode passt zu Brauereien?“ The value lists for filtering - legal forms, size classes - and, with a query word, the matching OENACE sectors with the exact nace_* filter to use. Read-only. Parameters: - query (optional): a category word (e.g. "Brauerei", "software"); returns ``matches`` with each sector's level, code, label and the nace_* filter value for search_companies. Omitted: the legal-form and size-class value lists with counts. Served from the Austrian backend; the industry codes are OENACE == WZ == NACE Rev. 2, identical for both countries, so a resolved code also filters the German register. The value lists and counts themselves are Austrian (a notice says so). It returns no company data - call it once up front to resolve a filter value.
usage
get_my_usage
Beispiel: „Wie viele Gratis-Credits sind noch übrig?“ 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.

Endpoints

URLTransportStateLatencyChecked
https://mcp.agentic-firmenbuch.at/mcp streamable-http sign-in 456 ms 10 min ago

Alternatives to Firmenbuch

same job, measured the same way
Handelsregister
by jkbngb

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

19 tools answering
apifirme
by apifirme

Romanian company data from the official registers: CUI lookup, VAT, financials, new companies

answering
Finbolt
by getfinbolt

SEC-filed company financials with filing citations, plus market data, for AI agents

25 tools answering
Toolstem MCP Server
by toolstem

Financial intelligence MCP for AI agents — DCF, ratios, comparisons. Pre-computed signals.

117 installs/wk local only
CompanyData.dk
by companydata

Danish company registry (CVR): company search, financials, ownership, beneficial owners and more.

answering
Lead Strategist: Danish CVR company data
by leadstrategist

Danish company data (CVR) and annual-report financials for B2B lead research. Read-only.

5 tools answering
Leadgen ONRC Romania
by adrianhomelab

Romanian company data for agents: 4.2M ONRC firms, ANAF status, financials 2008–2025. Free key.

21 tools answering
ROIC.AI Financial Data
by roic

ROIC.AI financial data: statements, ratios, prices, and earnings transcripts for public companies.

answering

Firmenbuch — questions

Answers built from our own checks of this server.

What can Firmenbuch do?
It exposes 19 tools, read directly from the server on our last check. Among them: benchmark_company, describe_fields, export_companies_csv, find_peers, get_cohort_summary, get_company_details and 13 more. The full list with descriptions is on this page — we take it from the server itself via tools/list, not from a README. How MCP servers expose tools in the first place →
What is Firmenbuch mostly used for?
Its tools cluster around company and document. That is what this server is built to work with — the grouping comes from the actual tool names, not from a category we assigned.
Is Firmenbuch working right now?
We send a real MCP handshake every 15 minutes. Over the last 24 hours 91 of 91 checks got a reply (100.0%), average response time 469 ms. The bar chart above shows every period we have measured.
How do I connect Firmenbuch?
Copy the ready config from this page. We generate it for Claude Code, Claude Desktop, Codex, Cursor and VS Code, each in the form that client actually reads. It is a remote server, so there is nothing to install — the client connects to the address. You sign in through your browser once and the client keeps the session: no key to copy, and it refuses anonymous clients.
How do you sign in to Firmenbuch?
No API key is involved. Firmenbuch answers our knock with an OAuth challenge, so you authorise it once in your browser and the client keeps the session. That is also why we see no tool list: it will not describe itself to an anonymous client, and that is the server working as intended, not a fault.
How fast is Firmenbuch?
It answers our handshake in 469 ms on average, which is faster than 26% of all working MCP servers we measure. The comparison comes from our own checks across the whole registry, every 15 minutes.
Is Firmenbuch open source?
The code is open source: it is published under the MIT licence, written in Python, 0 stars on GitHub and 12 open issues. The licence covers the code in the repository, not the hosted service at mcp.agentic-firmenbuch.at, which runs on its operator's own terms.