Skip to main content
Glama

Search companies (AT + DE)

search_companies
Read-onlyIdempotent

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
      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 - DE
    financial data is not covered yet (see get_coverage).

    For one company's full profile use get_company_details; for a downloadable list
    use export_companies_csv; for dataset completeness use get_coverage.
    

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNo
sortNo
afterNo
countryNoall
filtersNo
page_sizeNo
exact_countNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

TDQS

A5/5.0
Behavior5/5

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

Behavioral details go well beyond the annotations: a filter unsupported in one country excludes that country and appears in 'notices' rather than being silently dropped; unreachable backends are reported via 'countries_unavailable'; and German financials must not be reported as zero due to missing DE coverage. These are exactly the hidden behaviors an agent needs to avoid incorrect results.

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 fully front-loaded with purpose and then structured into clear labeled blocks: purpose, parameters, sort, paging, return envelope, usage warnings, and alternative tools. Although very long, every sentence covers a distinct and useful requirement for a high-complexity, multi-country search API, and there is no filler or repetition.

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 this huge parameter count and cross-country behavior. It covers not only parameters but also response shape, country block behavior, error/surprise behavior, sorting defaults, and a clear reference to get_coverage for data completeness. Nothing needed to invoke the tool correctly is missing.

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. It explains the semantics of filters (AND-combined, substring vs. meaning-based), shared vs. country-specific fields, country aliases, sort fields per country, keyset paging rules ('after' with cursors), exact_count behavior, and the country parameter. This goes far beyond the raw schema and is essential for correct calls.

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 opens with a specific action and resource: 'Find companies across the Austrian Firmenbuch and the German Handelsregister' and explicitly brands it as 'START HERE for any company lookup.' It also differentiates from siblings by naming get_company_details, export_companies_csv, and get_coverage for other use cases, which removes any ambiguity about the tool's role.

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 to use this tool first for any company lookup and then directs to alternatives: get_company_details for full profiles, export_companies_csv for downloads, and get_coverage for data completeness. This gives the agent clear conditions for when to use this tool versus siblings.

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.

TDQS

A4.8/5.0
Disambiguation4/5

Each tool has a distinct primary purpose, with clear pointers to the right tool for the job. The main possible confusion is between describe_fields/get_coverage and search_companies/search_person, but the descriptions actively disambiguate those boundaries.

Naming Consistency5/5

All tool names follow a consistent lowercase snake_case verb_noun pattern: describe_fields, export_companies_csv, get_company_details, list_events, search_companies. Even ping fits the predictable style as a simple liveness verb.

Tool Count5/5

Eleven tools is well-scoped for a unified company-register facade. Each tool covers a distinct part of the surface: schema, coverage, search, detail, persons, peers, events, statistics, export, and diagnostics.

Completeness5/5

The read-only domain is covered thoroughly: lookup, detail, person search, similarity, event feeds, aggregate stats, and export all exist. Unsupported country-specific features are handled with notices and coverage metadata rather than missing tooling.