Skip to main content
Glama

Find companies

find_companies
Destructive

Discover companies by hiring activity, technologies in use, similarity to one company domain, or a plain-language query (up to 400 characters, translated server-side into those filters and echoed back in result.interpreted). Industry phrases in a plain-language query are not applied; they appear in result.interpreted.dropped.industries so the result can be disclosed and narrowed with supported filters. Hiring, technology and query requests accept provider-taxonomy industries, ISO alpha-2 country_codes and company_headcount. Sent with a query, they win over what the query says; company_headcount merges bound by bound, so a bound you leave out keeps the query's value unless that would invert the range, in which case your range is used alone. result.interpreted.caller_filters lists them with every reading of the query they replaced or dropped. limit defaults to 25, maximum 100. exclude_domains (up to 500) leaves out companies you have already seen, in every mode: they are never returned or charged, and result.left_out.excluded counts those the search came across. A firmographic search fetches further to fill the limit, so sending the domains you already have is how to get the next companies. Returns unique companies with evidence and company_domains, plus jobs_last_30_days and last funding round facts when the source reports them. Technology matches carry match_confidence; only high-confidence companies are returned and billed unless include_low_confidence is true, which adds a separate unbilled low_confidence_companies list. Technologies take a tool's usual name (for example Customer.io or Pendo); an unknown name is refused with close suggestions. A similar_to request also accepts country_codes and company_headcount: each lookalike then comes back with headcount, industry and country, companies that don't fit are dropped and free (counted in result.filtered_out), and each company kept costs 33 credits. Hiring results cost 11 credits each, unfiltered lookalikes 13 and technology results 16; zero results are free. mode: "firmographic" finds companies by industries (LinkedIn's names, as on find_leads) and ISO alpha-2 country_codes, optionally narrowed by locations (cities or regions, matched against each company's headquarters) and company_headcount; 2 credits a company. mode: "local" finds local businesses by categories (for example "dentist") in locations, each a city with its country (for example "Leeds, United Kingdom"); 3 credits a business, with a website. budget_credits is a spend ceiling, never permission to use a dearer source: when the call could cost more, limit is lowered to the largest that fits and result.budget_applied says so. dry_run: true returns the plan instead (the most the call can cost, how many sources could answer, and each limit it would trip) with nothing looked up, reserved or charged. Example: {"hiring":{"titles":["GTM Engineer","Sales Development Representative"],"posted_within_days":30},"country_codes":["US","GB"],"company_headcount":{"min":50,"max":500},"limit":10} route picks how sources are chosen: balanced (the default), cheapest, broadest or fastest. The price is the same whichever you pick, and the answer's layrcake.route says which route was used and whether it came from the request, this key's default or the default.

Input Schema

NameRequiredDescriptionDefault
modeNofirmographic: companies by industries (LinkedIn's names, as on find_leads), country_codes, and optionally locations and company_headcount. local: local businesses by categories (for example "dentist") in locations. events: companies that had something happen (event, within within_days), each with a verbatim quote, its source and date; runs in the background and needs an Idempotency-Key. Leave it out for hiring, technologies, similar_to or query. Where a mode isn't available to this key yet, a request that sets it is refused with the reason.
eventNoOnly with mode events: what happened to the companies, in plain words, for example "opened a new office in London" or "disclosed a data breach".
limitNoMost companies to return: up to 100, default 25. Mode events: up to 25, default 15.
queryNoPlain-language description of the companies; one with no hiring or technology in it also needs a country (country_codes, or in the words).
routeNoSource preference for this call: balanced (the default), cheapest (the lowest-cost sources), broadest (the sources expected to find the most) or fastest. The price doesn't change with it. Where route choice isn't available to this key yet, only balanced is accepted.
hiringNo
dry_runNoReturn this call's plan instead of running it, as of evaluated_at: the most it can cost, how many sources could answer, what budget_credits changes, and every limit the real call would trip. Nothing is looked up, reserved or charged, and a later call may differ. Where previews aren't available to this key yet, a request that sets it is refused with the reason.
audienceNo
keywordsNoOnly with mode firmographic: 1 to 10 phrases, for example "carbon accounting"; for a non-English-speaking country add its own words too. A company matches when its own description, products or specialties mention any of them, in the language they are written in; with keywords, industries may be left out, and an industry that means the same as a keyword asks for it twice. Each company then comes back with its description. Where keywords aren't available to this key yet, a request that sets them is refused with the reason.
locationsNoPlaces, only with mode. firmographic: optional cities or regions inside country_codes, matched against each company's headquarters. local: required, each a city with its country, for example "Leeds, United Kingdom" or "Austin, TX".
categoriesNoOnly with mode local: the kinds of business, for example "dentist" or "commercial cleaning service".
industriesNoLinkedIn industry names, for example "Software Development" or "Online and Mail Order Retail"; other words go in keywords (firmographic).
min_ratingNoOnly with mode local: the lowest public map rating to keep, 1 to 5 with one decimal, for example 4.5. A business with no rating is left out and not charged. Where it isn't available to this key yet, a request that sets it is refused with the reason.
similar_toNoCompany website domain or URL, e.g. acme.com or https://www.acme.com/about
min_reviewsNoOnly with mode local: the fewest public map reviews to keep, for example 20. A business with no review count is left out and not charged. Where it isn't available to this key yet, a request that sets it is refused with the reason.
within_daysNoOnly with mode events: the event happened in the last this many days (1 to 365, default 90). A company whose event has no date is left out.
technologiesNo
country_codesNo
budget_creditsNoSpend ceiling for this call, in credits. If the most the call can cost is above it, limit is lowered to the largest that fits and result.budget_applied says so; the call is refused, before anything is reserved or charged, only when not even one company fits. It is a ceiling only: it never lets the call use a dearer source. Where spend ceilings aren't available to this key yet, a request that sets it is refused with the reason.
exclude_domainsNoCompany domains to leave out, up to 500: companies you've already seen. They are never returned or charged, and result.left_out.excluded counts those the search came across. In mode firmographic the search fetches further to fill the limit.
idempotency_keyNoA payment_required refusal means services are stopped for unpaid billing; direct the owner to the billing link in the error. Campaigns stay paused after payment until restarted. Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that.
include_handledNoOnly inside an agent run: true includes companies this agent already checked (yes or not_found) in the last 90 days, which the run's searches otherwise leave out. Outside an agent run it changes nothing.
exclude_keywordsNoOnly with mode firmographic: up to 10 phrases, for example "recruitment agency" or "consultancy". Companies whose own description mentions any of them are left out. Each company then comes back with its description. Where exclude_keywords aren't available to this key yet, a request that sets them is refused with the reason.
company_headcountNoEmployee-count range. With no min or max, companies with fewer than 10 employees are left out. Any bound replaces that default: a max without a min searches from 1 employee.
include_low_confidenceNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • addedInput schema / properties / exclude_domains
      Added value: +{
      +  "description": "Company domains to leave out, up to 500: companies you've already seen. They are never returned or charged, and result.left_out.excluded counts those the search came across. In mode firmographic the search fetches further to fill the limit.",
      +  "items": {
      +    "description": "Company website domain or URL, e.g. acme.com or https://www.acme.com/about",
      +    "maxLength": 2048,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 1000,
      +  "type": "array"
      +}
    • addedInput schema / properties / include_handled
      Added value: +{
      +  "description": "Only inside an agent run: true includes companies this agent already checked (yes or not_found) in the last 90 days, which the run's searches otherwise leave out. Outside an agent run it changes nothing.",
      +  "type": "boolean"
      +}
  2. Changed5 schema fields changed
    • addedInput schema / properties / event
      Added value: +{
      +  "description": "Only with mode events: what happened to the companies, in plain words, for example \"opened a new office in London\" or \"disclosed a data breach\".",
      +  "type": "string"
      +}
    • addedInput schema / properties / limit / description
      Added value: +"Most companies to return: up to 100, default 25. Mode events: up to 25, default 15."
    • changedInput schema / properties / mode / description
      Previous value: -"firmographic: companies by industries (LinkedIn's names, as on find_leads), country_codes, and optionally locations and company_headcount. local: local businesses by categories (for example \"dentist\") in locations. Leave it out for hiring, technologies, similar_to or query. Where a mode isn't available to this key yet, a request that sets it is refused with the reason."New value: +"firmographic: companies by industries (LinkedIn's names, as on find_leads), country_codes, and optionally locations and company_headcount. local: local businesses by categories (for example \"dentist\") in locations. events: companies that had something happen (event, within within_days), each with a verbatim quote, its source and date; runs in the background and needs an Idempotency-Key. Leave it out for hiring, technologies, similar_to or query. Where a mode isn't available to this key yet, a request that sets it is refused with the reason."
    • changedInput schema / properties / mode / enum
      Previous value: -[
      -  "firmographic",
      -  "local"
      -]New value: +[
      +  "firmographic",
      +  "local",
      +  "events"
      +]
    • addedInput schema / properties / within_days
      Added value: +{
      +  "description": "Only with mode events: the event happened in the last this many days (1 to 365, default 90). A company whose event has no date is left out.",
      +  "maximum": 365,
      +  "minimum": 1,
      +  "type": "integer"
      +}
  3. Changed2 schema fields changed
    • addedInput schema / properties / min_rating
      Added value: +{
      +  "description": "Only with mode local: the lowest public map rating to keep, 1 to 5 with one decimal, for example 4.5. A business with no rating is left out and not charged. Where it isn't available to this key yet, a request that sets it is refused with the reason.",
      +  "maximum": 5,
      +  "minimum": 1,
      +  "type": "number"
      +}
    • addedInput schema / properties / min_reviews
      Added value: +{
      +  "description": "Only with mode local: the fewest public map reviews to keep, for example 20. A business with no review count is left out and not charged. Where it isn't available to this key yet, a request that sets it is refused with the reason.",
      +  "maximum": 1000000,
      +  "minimum": 1,
      +  "type": "integer"
      +}
  4. Changed3 schema fields changed
    • addedInput schema / properties / industries / description
      Added value: +"LinkedIn industry names, for example \"Software Development\" or \"Online and Mail Order Retail\"; other words go in keywords (firmographic)."
    • changedInput schema / properties / keywords / description
      Previous value: -"Only with mode firmographic: 1 to 10 phrases, for example \"carbon accounting\" or \"dental practice management\". A company matches when its own description, products or specialties mention any of them; with keywords, industries may be left out. Each company then comes back with its description. Where keywords aren't available to this key yet, a request that sets them is refused with the reason."New value: +"Only with mode firmographic: 1 to 10 phrases, for example \"carbon accounting\"; for a non-English-speaking country add its own words too. A company matches when its own description, products or specialties mention any of them, in the language they are written in; with keywords, industries may be left out, and an industry that means the same as a keyword asks for it twice. Each company then comes back with its description. Where keywords aren't available to this key yet, a request that sets them is refused with the reason."
    • addedInput schema / properties / query / description
      Added value: +"Plain-language description of the companies; one with no hiring or technology in it also needs a country (country_codes, or in the words)."
  5. Changed2 schema fields changed
    • addedInput schema / properties / exclude_keywords
      Added value: +{
      +  "description": "Only with mode firmographic: up to 10 phrases, for example \"recruitment agency\" or \"consultancy\". Companies whose own description mentions any of them are left out. Each company then comes back with its description. Where exclude_keywords aren't available to this key yet, a request that sets them is refused with the reason.",
      +  "items": {
      +    "maxLength": 120,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • addedInput schema / properties / keywords
      Added value: +{
      +  "description": "Only with mode firmographic: 1 to 10 phrases, for example \"carbon accounting\" or \"dental practice management\". A company matches when its own description, products or specialties mention any of them; with keywords, industries may be left out. Each company then comes back with its description. Where keywords aren't available to this key yet, a request that sets them is refused with the reason.",
      +  "items": {
      +    "maxLength": 120,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that."New value: +"A payment_required refusal means services are stopped for unpaid billing; direct the owner to the billing link in the error. Campaigns stay paused after payment until restarted. Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that."
  7. Changed3 schema fields changed
    • addedInput schema / properties / categories
      Added value: +{
      +  "description": "Only with mode local: the kinds of business, for example \"dentist\" or \"commercial cleaning service\".",
      +  "items": {
      +    "maxLength": 120,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • addedInput schema / properties / locations
      Added value: +{
      +  "description": "Places, only with mode. firmographic: optional cities or regions inside country_codes, matched against each company's headquarters. local: required, each a city with its country, for example \"Leeds, United Kingdom\" or \"Austin, TX\".",
      +  "items": {
      +    "maxLength": 120,
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  "maxItems": 50,
      +  "type": "array"
      +}
    • addedInput schema / properties / mode
      Added value: +{
      +  "description": "firmographic: companies by industries (LinkedIn's names, as on find_leads), country_codes, and optionally locations and company_headcount. local: local businesses by categories (for example \"dentist\") in locations. Leave it out for hiring, technologies, similar_to or query. Where a mode isn't available to this key yet, a request that sets it is refused with the reason.",
      +  "enum": [
      +    "firmographic",
      +    "local"
      +  ],
      +  "type": "string"
      +}
  8. Changed1 schema field changed
    • addedInput schema / properties / route
      Added value: +{
      +  "description": "Source preference for this call: balanced (the default), cheapest (the lowest-cost sources), broadest (the sources expected to find the most) or fastest. The price doesn't change with it. Where route choice isn't available to this key yet, only balanced is accepted.",
      +  "enum": [
      +    "balanced",
      +    "cheapest",
      +    "broadest",
      +    "fastest"
      +  ],
      +  "type": "string"
      +}
  9. Changed2 schema fields changed
    • addedInput schema / properties / budget_credits
      Added value: +{
      +  "description": "Spend ceiling for this call, in credits. If the most the call can cost is above it, limit is lowered to the largest that fits and result.budget_applied says so; the call is refused, before anything is reserved or charged, only when not even one company fits. It is a ceiling only: it never lets the call use a dearer source. Where spend ceilings aren't available to this key yet, a request that sets it is refused with the reason.",
      +  "exclusiveMinimum": 0,
      +  "maximum": 2000,
      +  "type": "number"
      +}
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "description": "Return this call's plan instead of running it, as of evaluated_at: the most it can cost, how many sources could answer, what budget_credits changes, and every limit the real call would trip. Nothing is looked up, reserved or charged, and a later call may differ. Where previews aren't available to this key yet, a request that sets it is refused with the reason.",
      +  "type": "boolean"
      +}
  10. Changed1 schema field changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional for search and enrichment tools: supply one to make a retry replay the original result. Required for tools that create an external side effect; reuse the same value after a timeout or an approval."New value: +"Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that."
  11. Changed1 schema field changed
    • addedInput schema / properties / company_headcount / description
      Added value: +"Employee-count range. With no min or max, companies with fewer than 10 employees are left out. Any bound replaces that default: a max without a min searches from 1 employee."
  12. Changed3 schema fields changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Stable retry key; the same value identifies retries of the same request after timeout or approval."New value: +"Optional for search and enrichment tools: supply one to make a retry replay the original result. Required for tools that create an external side effect; reuse the same value after a timeout or an approval."
    • addedInput schema / properties / include_low_confidence
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / query
      Added value: +{
      +  "type": "string"
      +}
  13. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Although annotations declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, the description adds substantial behavioral context beyond them: per-company credit costs, zero-result forgiveness, exclude_domains being never charged, separately unbilled low-confidence results, budget-driven limit reduction, and dry_run making no lookup, reservation, or charge. That is exactly the kind of cost and side-effect disclosure an agent needs for a billed discovery tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose statement is front-loaded and most sentences carry useful information, but the description is an enormous single paragraph with dense nested clauses and even a garbled phrase ('layrcake.route'). For a 25-parameter tool some length is justified, but sections or bullets would make it far easier to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and 25 parameters, the description does well to explain the returned shape: interpreted fields, caller_filters, left_out.excluded, filtered_out, match_confidence, low_confidence_companies, and the core company evidence fields. It is not fully complete because it omits the events mode from the main prose and does not cover some parameters and result details, but the overall coverage is strong for a tool this complex.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 80%, so the baseline is 3, but the description adds meaningful semantics: query is capped at 400 characters, company_headcount merges bound-by-bound, budget_credits is a ceiling and never a source upgrade, and exclude_domains is intended for previously seen companies. It leaves a few parameters such as audience, include_handled, and include_low_confidence largely to the schema, and there is a minor discrepancy around exclude_domains' 500-item claim versus the schema's 1000 maxItems.

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 opening sentence names a specific verb and resource and enumerates the distinct discovery modes: hiring, technologies, similar_to, and plain-language query. It distinguishes the firmographic mode from find_leads by saying industries use LinkedIn names 'as on find_leads,' so an agent can route between the two tools without opening both schemas.

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

Usage Guidelines4/5

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

The description clearly states which modes accept which filters, explains credit costs, and tells the agent that exclude_domains is how to fetch the next batch. It also explains how budget_credits and dry_run behave. It stops short of explicitly saying when not to use this tool versus siblings like check_companies or enrich_company, leaving some routing inference to the agent.

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.

Resources