Skip to main content
Glama

Search companies (AT + DE)

search_companies
Read-onlyIdempotent

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.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "search_companies"
  }
}

Input Schema

NameRequiredDescriptionDefault
pageNo
sortNo
afterNo
countryNoall
filtersNo
page_sizeNo
exact_countNo

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / $defs / UnifiedSearchFilters / properties / nace_class
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Nace Class"
      +}
    • addedInput schema / $defs / UnifiedSearchFilters / properties / oenace_class
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Oenace Class"
      +}
    • addedInput schema / $defs / UnifiedSearchFilters / properties / wz_confidence_min
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "title": "Wz Confidence Min"
      +}
  2. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations, it discloses important behavior: unsupported filters exclude a country with a notice, unreachable backends appear in countries_unavailable, exact_count triggers a full scan, keyset paging is single-country only, and German financials must not be treated as zero before rollout coverage. These details materially affect correct use.

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 content is dense but well organized around parameters, returns, and alternatives. It is long and begins with a German example before the primary purpose statement, but nearly all content is operational and earns its place for a complex cross-country search tool.

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?

Despite high complexity, the description covers purpose, country-specific caveats, parameter semantics, return-envelope structure, notices, paging, sorting fallbacks, and sibling-tool routing. An output schema exists, and the description still explains the important response fields and limitations.

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 carries the full burden. It documents nearly every filter’s meaning, country availability, defaults, aliases, cross-country NACE equivalence, postal-code prefix behavior, radius semantics, balance-sheet screens, sorting fields, and paging behavior.

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 a specific verb and resource: find companies across the Austrian Firmenbuch and German Handelsregister. It also explicitly positions itself as the starting point for company lookups, which distinguishes it from focused sibling tools.

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

Usage Guidelines5/5

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

It explicitly says 'START HERE for any company lookup' and routes other needs to named alternatives: get_company_details for full profiles, export_companies_csv for downloadable lists, and get_coverage for dataset completeness. It also explains country-scope behavior and when a filter excludes a country.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.