About firmfind
firmfind is a client for the CompanyData service, for finding companies in official business registers and retrieving their records. It supports detailed company filters, full-record exports by ID and city suggestions, while passing service responses through unchanged.
Key features
- 01Search companies with detailed filters
- 02Export a full company record by ID
- 03Find city suggestions from place names
- 04Pass through unmodified service responses
Use cases
- 01Find companies by location and industry
- 02Identify records with specific contact details
- 03Retrieve a company’s complete register entry
- 04Resolve a partial city name before searching
MCP support
Exposes three CompanyData-backed tools to MCP clients: company search, full-record export and city lookup. Requests require a CompanyData API key.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
3Saved tool list · updated 1w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| ID | string | No | The identifier for this call. |
| page | integer | No | Page number for paginated results (optional). |
| string | No | Email address. | |
| search | string | No | Search text filter (optional). |
| website | string | No | Website URL (optional). |
| cityName | string | No | The city name for this call. |
| hasEmail | boolean | No | Filter to records that have an email address (optional). |
| hasPhone | boolean | No | Filter to records that have a phone number (optional). |
| pageSize | integer | No | The page size for this call. |
| hasCEOName | boolean | No | Filter to records that have a CEO name (optional). |
| hasWebsite | boolean | No | Filter to records that have a website (optional). |
| nationalId | string | No | National ID value (optional). |
| postalCode | string | No | The postal code for this call. |
| regionName | string | No | The region name for this call. |
| sic4Digits | string | No | The sic4 digits for this call. |
| statusCode | string | No | The status code for this call. |
| streetName | string | No | The street name for this call. |
| countryCode | string | No | The country code for this call. |
| countryName | string | No | The country name for this call. |
| legalStatus | string | No | The legal status for this call. |
| phoneNumber | string | No | Phone number (optional). |
| provinceName | string | No | The province name for this call. |
| hasNationalID | boolean | No | Filter to records that have a national ID (optional). |
| strictCountry | boolean | No | Require strict country matching (optional). |
| annualSalesMax | integer | No | The annual sales maximum for this call. |
| annualSalesMin | integer | No | The annual sales minimum for this call. |
| subsidiaryCode | string | No | The subsidiary code for this call. |
| employeesHereMax | integer | No | The employees here maximum for this call. |
| employeesHereMin | integer | No | The employees here minimum for this call. |
| foundingYearsMax | integer | No | The founding years maximum for this call. |
| foundingYearsMin | integer | No | The founding years minimum for this call. |
| hasMarketability | boolean | No | Filter to marketable records (optional). |
| importExportCode | string | No | The import export code for this call. |
| employeesTotalMax | integer | No | The employees total maximum for this call. |
| employeesTotalMin | integer | No | The employees total minimum for this call. |
| postalCodeIntegerMax | integer | No | The postal code integer maximum for this call. |
| postalCodeIntegerMin | integer | No | The postal code integer minimum for this call. |
| worldwideHeadquarterID | string | No | The worldwide headquarter identifier for this call. |
Details
From the project READMEfirmfind
Find companies in official business registers, then pull the full record for the one you meant. firmfind is a small client for the CompanyData service: search the registers by name, place, industry code, company size, age and whether a record carries an email address, a phone number, a website or a named CEO; export the complete entry for a single company by its ID; or resolve a half-remembered place name into city suggestions before you search with it.
Whatever the service returns comes back exactly as it was sent — nothing is trimmed, renamed or summarised on the way through.
Configuration
COMPANYDATA_API_KEY(required) — sent on every request as thex-api-keyheader. When it is not set, every tool fails withCOMPANYDATA_API_KEY is not setand no request is made.COMPANYDATA_API_BASE_URL(optional) — API base URL. Defaults tohttps://app.companydata.com.
Tools
company_search— search companies by name, location, industry, size and contact filters. All 38 arguments are optional: paging (page,pageSize), identity and text filters (ID,search,sic4Digits,importExportCode,legalStatus,statusCode,subsidiaryCode,countryCode,provinceName,cityName,streetName,regionName,countryName,postalCode,phoneNumber,email,worldwideHeadquarterID,nationalId,website), numeric ranges (postalCodeIntegerMin/Max,employeesHereMin/Max,employeesTotalMin/Max,annualSalesMin/Max,foundingYearsMin/Max) and presence flags (hasEmail,hasMarketability,hasPhone,hasWebsite,hasNationalID,hasCEOName,strictCountry). Only arguments you actually set are sent; booleans go astrue/falseand the range bounds use the API's bracketed wire names, for exampleemployeesHere[min].company_enrich— export the full record for one company by its CompanyDataID(required). The call always asks the export endpoint for the export form of the record.field_lookup— city suggestions for a place-namesearch(required), optionally narrowed bycountriesand capped bylimit.
An upstream non-2xx reply fails with
companydata error: HTTP <status> and an unreachable API
with companydata unreachable.
Endpoint provenance
The tool surface, the key environment variable and header, the default base URL and the enrichment behaviour are pinned by the original package's README; the parameter names, types and wire names are pinned by the official OpenAPI document:
GET <base>/api/company/search?<params>—company_search.GET <base>/api/company/export?ID=<id>&export=true—company_enrich.GET <base>/api/cities?<params>—field_lookup.
CLI
Each tool is a subcommand taking one JSON argument string:
npx @reneturcios/firmfind company_search '{"search":"bakery","countryCode":"NL","hasEmail":true}'
npx @reneturcios/firmfind company_enrich '{"ID":"abc-123"}'
npx @reneturcios/firmfind field_lookup '{"search":"amster","countries":"NL","limit":5}'
npx @reneturcios/firmfind --version
Output is the tool's result text (the upstream body on
success). Exit codes: 0 on success, 1 on a runtime error
(including a missing key or an upstream failure), 2 on a
usage error.
MCP server
npx -y @reneturcios/firmfind mcp
MCP client config:
{
"mcpServers": {
"firmfind": {
"command": "npx",
"args": ["-y", "@reneturcios/firmfind", "mcp"],
"env": {
"COMPANYDATA_API_KEY": "<your key>"
}
}
}
}
Docker
docker run -i ghcr.io/cloudcorprecords/firmfind
docker run --rm ghcr.io/cloudcorprecords/firmfind company_search '{"search":"bakery"}'
Development
npm install
npm run build # tsc -> dist/
npm test # tsx --test test/*.test.ts (fake fetch only, no network)
npm run dev # run the CLI from source
License
MIT — Copyright (c) 2026 Rene Turcios
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.