技能创建器
skill-creator
创建、改进和评估自定义技能,把专业流程转化为可重复使用的 AI 能力。
anysite-company-sourcing【数据与研究】The craft of sourcing companies from Anysite's 70M+ LinkedIn company database (search_sql_companies) - turning a fuzzy ICP into per-field DSL filters that return real matches instead of token soup. Fixes the default failure mode where naive keyword queries return companies from the wrong country, wrong industry and stub pages. Use when the user asks …
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
linkedin/search/search_sql_companies searches 70M+ companies and is the single
best bulk company tool in the catalog — and its naive use is the single most
common source of garbage lists. Measured live, same intent, same day:
{keywords: "AI startup San Francisco"} → 1 relevant of 5: a Tel-Aviv
gaming-data firm, a Sydney fintech and a Ho-Chi-Minh beauty e-commerce all
matched — each had the token "startup" somewhere in its description and
"San Francisco" among secondary office locations.The difference is the whole skill. Never ship results from a naive query.
keywords matches whole words across ALL text fields — name, description,
specialities, hashtags and the locations array — so "San Francisco" as a
keyword still matches a Hanoi company that lists an SF sales office in
locations. (Whole-word matching removed the inner-substring noise, but not
the wrong-FIELD problem — HQ is a separate field, use it.)sort changes ordering, not the candidate set — a naive keyword query is
still not an ICP list. With relevance (the default), "AI startup San
Francisco" surfaces Startup Weekend AI, Bitcoin AI Startup Lab, 1-employee
shops and a Phoenix-HQ company (all measured) — they score high because the
words sit in their NAME. The fix is per-field decomposition below, not a sort
flag.employee_count_range can contradict employee_count in the same record
(measured: 305 employees with range "11-50"). Never filter or segment by the
range string.Take the user's ICP sentence apart and map each fragment to its OWN field. No ICP in the
request → take it from the ICP section of anysite-gtm-profile when it exists (and say so
in one line), including its exclusions.
| Intent fragment | Field | Notes |
|---|---|---|
| "based in X" | country_hq: ["US"] + headquarter_location: "\"san francisco\"" | token-aware; NEVER the locations field — that matches branch offices |
| "present in X" (offices count too) | country_any | this is the only right use of the locations array |
| "does AI / fintech / logistics" | specialities OR industry_name OR description together, not specialities alone | industry array wants URNs; industry_name resolves labels — see the specialities caveat below |
| "in the orbit of company X" | similar_organizations: "\"fsd_company:<id>\"" | queryable filter, not just an output field — the reverse-graph expander; see below |
| "startup / SMB / enterprise" | employee_count_min / employee_count_max | integers; ignore employee_count_range entirely |
| "founded recently" | founded_on_min | year |
| named company lookup | name or alias DSL + exact verification | never trust first hit; a known domain → companies/resolve (anysite-mcp) |
| always, every query | is_active: true, has_website: true, min_description_length: 100 | the hygiene trio kills stubs and dead pages |
| ranking | sort = relevance (default) or last_modified | relevance for sourcing; last_modified for "what's new since last run" (monitoring). Scoring weights a term by field: name 5× > specialities/hashtags 3× > short_description 2× > long description 1×, length-normalized; ties broken by recency. Caveat: the score is built only from keywords/name/specialities/description — a query filtered ONLY by non-text fields (e.g. just industry + employee_count_min) has nothing to score, so it falls back to recency order |
Industry labels are often wrong or empty (auto-created LinkedIn pages especially). When
missing a company matters more than extra noise, run a second query with the description
terms and NO industry filter, merge the two (merge_data with dedupe_by: ["urn"]) and
decide each row with one yes/no question — the wide-net method in anysite-crm-lookalikes.
DSL in every text field: whitespace = AND, | = OR (no spaces around it),
"phrase" = exact phrase / substring, -token = NOT. Example:
specialities: "\"artificial intelligence\"|\"machine learning\" -agency".
IRON RULE: quote every multi-word alternative in an OR chain. Whitespace
binds tighter than | — name: "Level Infinite|Proxima Beta" parses as
(Level) AND (Infinite|Proxima) AND (Beta) and returns 0 (verified live on the
sibling people endpoint, same parser). Lint before sending: a space inside an
OR alternative without quotes → fix first.
Matching semantics (changed — this is now the biggest lever):
keywords: "sdr" returns "SDR Academy", "SDR Foundry", "Vida SDR" — companies
with the standalone word, and no longer "adviseur"-style inner hits). Case
doesn't matter.integration does NOT find integrations — write both:
integration|integrations. Same for singular/plural and verb forms."integr" matches both
integration and integrations; "machine learning" matches that exact
sequence. Use quotes deliberately when you WANT a fragment.b2b-saas, S.E.E.D., x.com) and Cyrillic are
auto-substring — nothing to change for them.alias and website are untouched — still substring (alias: "openai" finds
openai-inc); hashtags is exact element match.Practical consequence: short single-word queries used to be the WORST case (inner substring noise); they are now precise. If you actually need "a piece of a word", reach for quotes.
Specialities caveat: self-declared tags are the highest-signal field WHEN
present, but hot young startups often leave them blank — measured: 2/10 in a
US/Software slice had empty specialities[], one of them Hebbia ($160M-funded,
empty short_description too). So specialities is a widening OR alongside
industry_name and description, never the sole gate, or you silently drop
exactly the fresh-funded targets a list is built for.
count: 10.employee_count. Fewer than ~8 on target → the query is wrong, not the data:
move misused fragments to their proper field, add -tokens, tighten
phrases. On target → widen coverage with | synonyms in the same fields
("machine learning"|"computer vision"|"nlp"), re-probe.count up to 1000). More than 1000 matches →
split by size bands / countries / founded ranges into disjoint queries.query_cache on the result for sorting, counting,
sub-segmenting — don't re-execute.show_entity_table(cache_key, title=<intent>) instead of pasting rows; when the user wants to qualify the
list one by one, review_leads(cache_key) — the approved companies come back
as a cache_key for people sourcing or CRM push (anysite-mcp → Tables, joins
and lead review).Unlike people search, company search has no bucket_total, and its dry_run
count-only mode does not reach you through the MCP (the count travels in a response
header; the call returns an empty list). That means:
sort.)employee_count drifts from reality on some records). Dedup on band
boundaries by urn (query_cache uniq). last_modified_after +
sort: last_modified is the right combo for a "new since last run" sweep.Every row carries, at no extra cost (names as in the call's table rows; full records
from get_page use organizational_urn / website / crunchbase_link):
company_id → feeds anysite-people-sourcing (current_company_id) and
search_jobs directly;domain → domain for CRM matching and current_company_domain people filters;crunchbase_alias → free crunchbase alias, skip the live 20cr search;similar_organizations[] → both an output list AND a queryable filter (the
bigger lever — see below);specialities[] → the company's own vocabulary, reuse it to widen synonyms.Verified live: similar_organizations: "\"fsd_company:1441\"" (Salesforce) +
country_hq:["US"] + size band returned 8 companies, all 8 carrying Salesforce in
their own similar-orgs graph. This is "who sits in the orbit of company X" — the
right tool for two jobs no keyword query does well:
fsd_company
id, get its competitive/adjacent set.anysite-crm-competitor-intel via wappalyzer/reviews.)Noisy — roughly 3/8 were on-target in the test — so always combine with
industry_name/specialities and run the probe-validate loop. Batch-fetching the
output similar_organizations[] by urn:[...] (≤12 at a time) is the weaker,
one-hop version; the filter is the scalable one.
crunchbase/db/db_search (dates as
unix ts, count ≤100) or live crunchbase/search (hiring, it_spend filters).companies/resolve (exact domain; recipe in
anysite-mcp — several candidates can claim one domain, pick the right one).yc/search/search_companies, producthunt, betalist.anysite-people-sourcing with the URNs/domains
from step "bonus fields". CRM push → anysite-crm-prospect (dedup + create rules).