Search ctscout by multiple company names in one call
ctscout_search_company_batchLook up apex domains for multiple company names in a single batch call, with partial matching and results returned in input order.
Instructions
Look up apex domains for up to 10 organization names in a single call, via ctscout.dev's /scan/batch endpoint. Each name is matched exactly like ctscout_search_company; results come back in input order.
Args:
company_names (string[], required): 1–10 organization names. Partial matches work — 'Goldman' matches 'Goldman Sachs'. Each 2–200 chars.
response_format ('markdown' | 'json', default 'markdown'): output format.
Returns (on success, structuredContent follows the declared outputSchema; an error result — 401, 429, timeout — is isError with no structuredContent, so never dereference snapshot on a failed call):
"Attributed" and "candidate" mean exactly what they mean in ctscout_search_company: what the evidence names (the OV/EV certificate subject on /scan, both tiers) vs a semantic name-similarity guess that is NOT an attribution.
In markdown: a snapshot line, then one section per company (heading + the same attributed-domains table as ctscout_search_company; a candidate-organizations table when that name's match_type is 'semantic'), followed by remaining quota. Names that failed render an error line instead of a table.
In JSON, the batch envelope: { "results": [ { "query": {...}, "domains": [...], "total": number, "match_type": "exact"|"semantic"|"none", "candidates"?: [...] }, // same per-result fields as ctscout_search_company { "query": {...}, "error": { "code": number, "message": string } } ], "remaining_quota": number | null, // null = no remaining count reported (Pro today); a per-day request guard still applies "snapshot": string | null, // sync date shared by every result in the batch (API version 2026-09-05+); null (unknown freshness) only when the API could not determine it "snapshot_source": "scan" | "unavailable" }
Partial-failure semantics (important):
This is a 207-style mixed-result envelope, NOT all-or-nothing: one name can fail (its result carries an "error" object with no "domains") while the rest succeed.
Quota debits by the number of names in the batch — every name counts once, even zero-result ones. No free riders.
Examples:
Use when: "Look up Cloudflare, Fastly, and Akamai" -> { company_names: ["Cloudflare", "Fastly", "Akamai"] }
Don't use when: you have a single name (use ctscout_search_company) or a specific domain (use ctscout_lookup_domain).
Auth & limits:
Requires an API key in CTSCOUT_API_KEY, same as ctscout_search_company.
Oversized batches (>10 names) are rejected with a validation error before any network call and without a partial quota debit.
This MCP batch tool intentionally accepts names only. For matching modifiers such as strict_match_org_only, purpose, or org_match_mode, use individual ctscout_search_company calls or the REST /scan/batch endpoint.
Legal-vs-brand and coverage caveats are identical to ctscout_search_company — brand names may need legal-entity variants ("X Companies", "X Group", "The X"), and coverage is best for established US/EU entities with OV/EV certs.
Corrections:
Wrong attribution? Open an issue at https://github.com/minghsuy/ctscout-mcp/issues. Missing entity? Email pro@ctscout.dev. Include the name queried, the result returned and why it is wrong.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| company_names | Yes | Company / organization names to look up in one call (1–10). Each is matched exactly as in ctscout_search_company (partial, case-insensitive). Results come back in input order; individual names can fail independently (partial-failure envelope), so a failed name doesn't sink the batch. | |
| response_format | No | Output format: 'markdown' for a per-company summary, 'json' for the raw batch envelope (useful for programmatic processing). | markdown |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| results | Yes | One item per input name, in input order. | |
| snapshot | Yes | Warehouse/D1 sync date (YYYY-MM-DD) the answer was read from; the warehouse syncs daily. null when the API could not determine it. | |
| remaining_quota | Yes | null = the API reported no remaining count for this key (Pro today); a per-day request guard still applies, and a 429 carries the API's own detail. | |
| snapshot_source | Yes | 'scan' = the API response carried the date; 'unavailable' = it did not, snapshot is null and must be treated as unknown, never as current. |