Skip to main content
Glama

Search companies

search_companies
Read-onlyIdempotent

Search national company registries by name or keyword across multiple countries. Filter results with country-specific fields like postal code or registration number.

Instructions

Search a national company registry by name or keyword. Pass EXACTLY ONE of: • jurisdiction='GB' - single country, direct. • jurisdictions=['GB','NO','FR'] - multi-country when you're unsure; the server asks the user to confirm (clients with MCP elicitation) or errors back asking you to ask in chat. Per-tier cap on distinct countries per call: anonymous=3, pro=10, max=30, enterprise=unlimited.

Returns candidates with unified fields (company_id, company_name, status, incorporation_date, registered_address) plus raw upstream jurisdiction_data. For country-specific filters (FR ca_min, CZ czNace, CH canton, etc.) pass the filters object — call list_jurisdictions for the per-country schema.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
jurisdictionNoISO 3166-1 alpha-2 country code (uppercase; CA subdivisions hyphenated, e.g. 'CA-BC'). Use this when one country is known. Mutually exclusive with `jurisdictions`.
jurisdictionsNoArray of ISO codes when the country is uncertain. The server asks the user to confirm the list (clients with MCP elicitation) or returns an error so you can ask in chat. Mutually exclusive with `jurisdiction`.
queryNoCompany name or keyword. May be empty for FR / IE when searching purely by structured `filters`. AU also accepts structured `key:value` pairs in this field (e.g. 'postcode:2000 type:PUB active:Y').
limitNoMax candidates to return (1-250). Default 10.
offsetNoPagination offset (IE / FR).
filtersNoCountry-specific advanced filters. Flat object keyed by the upstream field name (e.g. FR `code_postal` / `ca_min`, CZ `czNace`, CH `canton`, FI `companyForm`, IE `alpha`, IS `vat_number`). Call `list_jurisdictions({jurisdiction:'<CC>'})` for the per-country schema.
freshNoBypass cache; call upstream directly.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
queried_atYesISO-8601 + Europe/London timezone stamp for when the registry was queried.
jurisdictionNoSingle-country mode.
jurisdictionsNoMulti-country fan-out mode.
queryNo
countNo
cached_atNo
resultsNoCandidate list (single-country key).
candidatesNoCandidate list (multi-country fan-out key).
per_jurisdictionNo
partial_failuresNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed64 schema fields changedv1.0.4
    • removedInput schema / properties / activeOnly
      Removed value: -{
      -  "description": "CH only. If true, returns only ACTIVE companies (excludes CANCELLED and BEING_CANCELLED).",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / activite_principale
      Removed value: -{
      -  "description": "FR / FR-near-point only. NAF/APE industry code (e.g. '64.20Z').",
      -  "type": "string"
      -}
    • removedInput schema / properties / address
      Removed value: -{
      -  "description": "Registered-address substring filter. IE: free-text substring of the company address. IS: prefix of the 'heimili' field on Skatturinn's /leit form (upstream accepts a single word or street prefix; Icelandic-dative form when searching by street name).",
      -  "type": "string"
      -}
    • removedInput schema / properties / alpha
      Removed value: -{
      -  "description": "IE only. Alphabetic prefix filter on the company name.",
      -  "type": "string"
      -}
    • removedInput schema / properties / bus_ind
      Removed value: -{
      -  "description": "IE only. Which CRO register to search: 'C' = companies (default), 'B' = business names, 'E' = both (slowest).",
      -  "enum": [
      -    "C",
      -    "B",
      -    "E"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / ca_max
      Removed value: -{
      -  "description": "FR only. Maximum chiffre d'affaires (revenue) in EUR.",
      -  "type": "number"
      -}
    • removedInput schema / properties / ca_min
      Removed value: -{
      -  "description": "FR only. Minimum chiffre d'affaires (revenue) in EUR.",
      -  "type": "number"
      -}
    • removedInput schema / properties / canton
      Removed value: -{
      -  "description": "CH only. 2-letter canton abbreviation (ZH / BE / GE / VD / VS / TI / ...). Mutually exclusive with registryOfCommerceId or legalSeatId.",
      -  "maxLength": 2,
      -  "minLength": 2,
      -  "type": "string"
      -}
    • removedInput schema / properties / categorie_entreprise
      Removed value: -{
      -  "description": "FR only. Company size category.",
      -  "enum": [
      -    "PME",
      -    "ETI",
      -    "GE"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / code_commune
      Removed value: -{
      -  "description": "FR only. INSEE commune code.",
      -  "type": "string"
      -}
    • removedInput schema / properties / code_postal
      Removed value: -{
      -  "description": "FR only. 5-digit French postal code (e.g. '75001'). Note: filters companies whose ANY establishment is at this postcode — the company's siège social may be elsewhere. Check `jurisdiction_data.matching_etablissements` to see which establishment matched.",
      -  "type": "string"
      -}
    • removedInput schema / properties / companyForm
      Removed value: -{
      -  "description": "FI only. Company form code: OYJ (public Ltd), OY (private Ltd), KY (limited partnership), AY (partnership), OK (cooperative), SÄÄ (foundation), AOY (housing company), etc.",
      -  "type": "string"
      -}
    • removedInput schema / properties / czNace
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "pattern": "^([0-9]{5}|[A-U])$",
      -      "type": "string"
      -    },
      -    {
      -      "items": {
      -        "pattern": "^([0-9]{5}|[A-U])$",
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  ],
      -  "description": "CZ only. NACE industry code(s). ARES requires 5-DIGIT or single-LETTER form: 5 digits for sub-class (e.g. '62010' programming), single letter A-U for the section (e.g. 'G' wholesale & retail). 4-digit (class) or 2-digit (division) values are rejected by zod — they would otherwise silently return 0 results from ARES. Filtering by section alone usually exceeds the >1000 cap; combine with another filter."
      -}
    • removedInput schema / properties / date_naissance_personne_max
      Removed value: -{
      -  "description": "FR only. Maximum birth date of a person (YYYY-MM-DD).",
      -  "type": "string"
      -}
    • removedInput schema / properties / date_naissance_personne_min
      Removed value: -{
      -  "description": "FR only. Minimum birth date of a person (YYYY-MM-DD).",
      -  "type": "string"
      -}
    • removedInput schema / properties / departement
      Removed value: -{
      -  "description": "FR only. 2-3 digit department code (e.g. '75', '971').",
      -  "type": "string"
      -}
    • removedInput schema / properties / epci
      Removed value: -{
      -  "description": "FR only. EPCI (intermunicipal grouping) SIREN.",
      -  "type": "string"
      -}
    • removedInput schema / properties / est_association
      Removed value: -{
      -  "description": "FR only. Only entities registered as associations (RNA).",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_bio
      Removed value: -{
      -  "description": "FR only. Only Agence Bio certified establishments.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_collectivite_territoriale
      Removed value: -{
      -  "description": "FR only. Only territorial collectivities.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_entrepreneur_individuel
      Removed value: -{
      -  "description": "FR only. Only sole traders.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_ess
      Removed value: -{
      -  "description": "FR only. Only social/solidarity-economy entities.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_organisme_formation
      Removed value: -{
      -  "description": "FR only. Only training organisations.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_qualiopi
      Removed value: -{
      -  "description": "FR only. Only Qualiopi-certified training organisations.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_rge
      Removed value: -{
      -  "description": "FR only. Only RGE (environmental) certified.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_service_public
      Removed value: -{
      -  "description": "FR only. Only public-service entities.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / est_societe_mission
      Removed value: -{
      -  "description": "FR only. Only mission-driven companies.",
      -  "type": "boolean"
      -}
    • removedInput schema / properties / etat_administratif
      Removed value: -{
      -  "description": "FR only. 'A'=active, 'C'=ceased. Note: the establishment-level 'F'=Fermé state appears in the data but is NOT a valid filter value upstream — use 'C' for closed entities.",
      -  "enum": [
      -    "A",
      -    "C"
      -  ],
      -  "type": "string"
      -}
    • addedInput schema / properties / filters
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Country-specific advanced filters. Flat object keyed by the upstream field name (e.g. FR `code_postal` / `ca_min`, CZ `czNace`, CH `canton`, FI `companyForm`, IE `alpha`, IS `vat_number`). Call `list_jurisdictions({jurisdiction:'<CC>'})` for the per-country schema.",
      +  "type": "object"
      +}
    • removedInput schema / properties / financniUrad
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  ],
      -  "description": "CZ only. Tax-office code(s) — see FinancniUrad code-list."
      -}
    • removedInput schema / properties / force_name_search
      Removed value: -{
      -  "description": "IS only. When true, treats the query as a plain name search even if it happens to be a 10-digit string (otherwise the adapter treats 10 digits as a kennitala direct-lookup).",
      -  "type": "boolean"
      -}
    • changedInput schema / properties / fresh / description
      Previous value: -"Bypass the search cache and call upstream registries directly. Default false."New value: +"Bypass cache; call upstream directly."
    • removedInput schema / properties / ico
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  ],
      -  "description": "CZ only. One or more exact IČO values to look up."
      -}
    • removedInput schema / properties / include_business_names
      Removed value: -{
      -  "description": "IE only. Convenience flag — when true, sets bus_ind='E' to search both registers.",
      -  "type": "boolean"
      -}
    • changedInput schema / properties / jurisdiction / description
      Previous value: -"EXACTLY ONE of `jurisdiction` or `jurisdictions` must be provided. Use `jurisdiction` (singular) when the user has clearly specified ONE country — a direct lookup, no confirmation screen shown. ISO 3166-1 alpha-2 country code. Supported values: 'GB', 'NO', 'AU', 'IE', 'FR', 'FI', 'CZ', 'PL', 'CA', 'CA-BC', 'CA-NT', 'BE', 'IM', 'IS', 'CY', 'CH', 'TW', 'LI', 'DE', 'NZ', 'NL', 'MC', 'IT', 'RU'. Use the exact uppercase code (ISO-3166-2 hyphenated form for CA subdivisions)."New value: +"ISO 3166-1 alpha-2 country code (uppercase; CA subdivisions hyphenated, e.g. 'CA-BC'). Use this when one country is known. Mutually exclusive with `jurisdictions`."
    • changedInput schema / properties / jurisdictions / description
      Previous value: -"EXACTLY ONE of `jurisdiction` or `jurisdictions` must be provided. Use `jurisdictions` (plural) when you are UNCERTAIN which country the company is in and want to search multiple candidates. Pass an array of 2–N ISO codes representing your best guesses based on company name / domain / user hints. The server will SHOW THE USER your picks in a confirmation dialog (on clients that support it — Claude Desktop, Claude Code, Cursor, and new Gemini CLI) and let them edit before running any search. On clients without that support, the call returns an error telling you to ask the user in chat. Per-tier caps on how many countries can be searched in one call: anonymous/free=3, pro=10, max=30, enterprise=unlimited. If you pass more than the user's cap, the confirmation form will trim to the cap."New value: +"Array of ISO codes when the country is uncertain. The server asks the user to confirm the list (clients with MCP elicitation) or returns an error so you can ask in chat. Mutually exclusive with `jurisdiction`."
    • removedInput schema / properties / legalFormId
      Removed value: -{
      -  "description": "CH only. Internal legal-form ID (1-999). Use get_code_description(CH, legalForm) to discover codes. Example: 9 = Aktiengesellschaft (AG).",
      -  "maximum": 999,
      -  "minimum": 1,
      -  "type": "integer"
      -}
    • removedInput schema / properties / legalFormUid
      Removed value: -{
      -  "description": "CH only. Public legal-form code per eCH-0097 data standard (4 chars). Example: '0106' = AG, '0108' = Sàrl. Alternative to legalFormId.",
      -  "maxLength": 4,
      -  "minLength": 4,
      -  "type": "string"
      -}
    • removedInput schema / properties / legalSeatId
      Removed value: -{
      -  "description": "CH only. BFS commune number of the legal seat. Use get_code_description(CH, community) to discover. Example: 261 = Zurich city. Mutually exclusive with registryOfCommerceId or canton.",
      -  "type": "integer"
      -}
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum candidates to return (1-250). Default 10. Per-jurisdiction upstream caps: GB 100, NO 1000, AU 200, IE 250."New value: +"Max candidates to return (1-250). Default 10."
    • removedInput schema / properties / location
      Removed value: -{
      -  "description": "FI only. Town or city name (any of FI/SV/EN names match).",
      -  "type": "string"
      -}
    • removedInput schema / properties / mainBusinessLine
      Removed value: -{
      -  "description": "FI only. Statistics Finland TOL 2008 industry code (e.g. '6201') or text.",
      -  "type": "string"
      -}
    • removedInput schema / properties / match_type
      Removed value: -{
      -  "description": "IE only. Match strategy for the company_name parameter. 'exact' is fastest (~300ms), 'starts_with' moderate, 'contains' slowest (~3s) — default contains.",
      -  "enum": [
      -    "exact",
      -    "starts_with",
      -    "contains"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / nature_juridique
      Removed value: -{
      -  "description": "FR only. Legal-form code (INSEE).",
      -  "type": "string"
      -}
    • removedInput schema / properties / nom_personne
      Removed value: -{
      -  "description": "FR only. Surname of a dirigeant or elected official to filter by.",
      -  "type": "string"
      -}
    • changedInput schema / properties / offset / description
      Previous value: -"IE / FR only. Skip the first N results (pagination). CRO caps each page at 250; FR at 25. Combine with limit to walk large result sets."New value: +"Pagination offset (IE / FR)."
    • removedInput schema / properties / page
      Removed value: -{
      -  "description": "FI only. Page number (1-indexed). PRH paginates with `page` not offset.",
      -  "minimum": 1,
      -  "type": "integer"
      -}
    • removedInput schema / properties / postCode
      Removed value: -{
      -  "description": "FI only. 5-digit Finnish postcode.",
      -  "type": "string"
      -}
    • removedInput schema / properties / pravniForma
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  ],
      -  "description": "CZ only. Legal-form code(s) — see PravniForma code-list (e.g. '112'=s.r.o./LLC, '121'=a.s./joint-stock, '100'=sole trader). Use get_code_description for the full list."
      -}
    • removedInput schema / properties / pravniFormaRos
      Removed value: -{
      -  "anyOf": [
      -    {
      -      "type": "string"
      -    },
      -    {
      -      "items": {
      -        "type": "string"
      -      },
      -      "type": "array"
      -    }
      -  ],
      -  "description": "CZ only. Legal-form code(s) from the ROS public-registers source — usually equivalent to pravniForma."
      -}
    • removedInput schema / properties / prenoms_personne
      Removed value: -{
      -  "description": "FR only. Given name(s) of a dirigeant/elected official.",
      -  "type": "string"
      -}
    • changedInput schema / properties / query / description
      Previous value: -"Company name or keyword. May be EMPTY for FR/IE when you're searching purely by structured filters (e.g. code_postal + ca_min for FR; address + alpha for IE). For AU only, also accepts structured filter syntax: space-separated key:value pairs such as 'postcode:2000 type:PUB active:Y' or 'charity:Y state:NSW postcode:2000'. All other jurisdictions use plain name search."New value: +"Company name or keyword. May be empty for FR / IE when searching purely by structured `filters`. AU also accepts structured `key:value` pairs in this field (e.g. 'postcode:2000 type:PUB active:Y')."
    • removedInput schema / properties / region
      Removed value: -{
      -  "description": "FR only. 2-digit region code.",
      -  "type": "string"
      -}
    • removedInput schema / properties / registrationDateEnd
      Removed value: -{
      -  "description": "FI only. Filter companies registered on/before this date (YYYY-MM-DD).",
      -  "type": "string"
      -}
    • removedInput schema / properties / registrationDateStart
      Removed value: -{
      -  "description": "FI only. Filter companies registered on/after this date (YYYY-MM-DD).",
      -  "type": "string"
      -}
    • removedInput schema / properties / registryOfCommerceId
      Removed value: -{
      -  "description": "CH only. Internal office number of the cantonal registry of commerce. Use get_code_description(CH, registryOfCommerce) to discover. Example: 20 = Zurich. Mutually exclusive with legalSeatId or canton.",
      -  "type": "integer"
      -}
    • removedInput schema / properties / resultat_net_max
      Removed value: -{
      -  "description": "FR only. Maximum résultat net in EUR.",
      -  "type": "number"
      -}
    • removedInput schema / properties / resultat_net_min
      Removed value: -{
      -  "description": "FR only. Minimum résultat net (net profit) in EUR (can be negative).",
      -  "type": "number"
      -}
    • removedInput schema / properties / section_activite_principale
      Removed value: -{
      -  "description": "FR only. Single-letter NAF section A-U.",
      -  "type": "string"
      -}
    • removedInput schema / properties / sidlo
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "CZ only. Registered-office address filter. Full ARES AdresaFiltr schema supported — use structured RÚIAN codes (kodObce/kodUlice/...) when you have them for exact matches, or free-text (obec/ulice/psc/textovaAdresa) for fuzzy searches. Resolve text to codes via the search_addresses tool.",
      -  "properties": {
      -    "cisloDomovni": {
      -      "description": "House number (before the slash).",
      -      "maximum": 9999,
      -      "minimum": 0,
      -      "type": "integer"
      -    },
      -    "cisloOrientacni": {
      -      "description": "Orientation number (after the slash).",
      -      "maximum": 999,
      -      "minimum": 0,
      -      "type": "integer"
      -    },
      -    "cisloOrientacniPismeno": {
      -      "description": "Orientation number letter suffix.",
      -      "maxLength": 1,
      -      "type": "string"
      -    },
      -    "kodCastiObce": {
      -      "description": "RÚIAN district code within municipality.",
      -      "maximum": 999999,
      -      "minimum": 0,
      -      "type": "integer"
      -    },
      -    "kodMestskeCastiObvodu": {
      -      "description": "City district code for statutory cities.",
      -      "maximum": 999999,
      -      "minimum": 0,
      -      "type": "integer"
      -    },
      -    "kodObce": {
      -      "description": "RÚIAN municipality code (authoritative).",
      -      "maximum": 999999,
      -      "minimum": 0,
      -      "type": "integer"
      -    },
      -    "kodSpravnihoObvodu": {
      -      "description": "Prague admin district code.",
      -      "maximum": 999,
      -      "minimum": 0,
      -      "type": "integer"
      -    },
      -    "kodUlice": {
      -      "description": "RÚIAN street code.",
      -      "maximum": 9999999,
      -      "minimum": 0,
      -      "type": "integer"
      -    },
      -    "obec": {
      -      "description": "Municipality name (free-text, e.g. 'Praha').",
      -      "type": "string"
      -    },
      -    "psc": {
      -      "description": "Postal code (5 digits, optional space).",
      -      "type": "string"
      -    },
      -    "textovaAdresa": {
      -      "description": "Unstructured full-text address (overrides free-text obec/psc/ulice).",
      -      "type": "string"
      -    },
      -    "ulice": {
      -      "description": "Street name (free-text).",
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
    • removedInput schema / properties / tranche_effectif_salarie
      Removed value: -{
      -  "description": "FR only. INSEE employee-count band code.",
      -  "type": "string"
      -}
    • removedInput schema / properties / type_personne
      Removed value: -{
      -  "description": "FR only. Restrict person filter to officers or elected officials.",
      -  "enum": [
      -    "dirigeant",
      -    "elu"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / vat_number
      Removed value: -{
      -  "description": "IS only. Icelandic VSK-númer (VAT number). Usually 5–6 digits (e.g. '11459'). Skatturinn's upstream /leit form redirects a VSK hit straight to the company profile; the adapter surfaces this as a single-candidate result.",
      -  "type": "string"
      -}
    • changedOutput schema / properties / results / items / properties / jurisdiction_data / description
      Previous value: -"Full original response fields from the upstream registry, field names unchanged. Shape is jurisdiction-specific — see `list_jurisdictions({ jurisdiction: '<CODE>' })`."New value: +"Full original response fields from the upstream registry, field names unchanged. Shape is jurisdiction-specific - see `list_jurisdictions({ jurisdiction: '<CODE>' })`."
  2. First observedv1.0.3

TDQS

A5/5.0
Behavior5/5

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

Beyond annotations (readOnly, idempotent), the description adds behavioral details: fresh parameter bypasses cache, multi-country elicitation, tier limits, and return fields. No contradiction with annotations.

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?

Well-structured with bullet points for options, front-loaded purpose, and every sentence adds value. No fluff; appropriately sized for the complexity.

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?

Covers all key aspects: required/optional params, mutual exclusivity, caching, pagination, user confirmation, tier limits, filter delegation, and return fields. Output schema exists, so return value details are handled there.

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?

Even with 100% schema coverage, the description adds significant meaning: clarifies mutual exclusivity of jurisdiction/jurisdictions, provides examples for query (e.g., AU key:value pairs), and explains filters as per-country schemas referencing list_jurisdictions.

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's purpose: 'Search a national company registry by name or keyword.' It uses a specific verb (search) and resource (company registry), and distinguishes from sibling tools like search_officers and list_jurisdictions.

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?

Provides explicit guidance on when to use jurisdiction vs jurisdictions, explains user confirmation for multi-country, mentions per-tier caps, and directs to list_jurisdictions for country-specific filters. This covers when to use and alternatives.

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