@anysiteio/agent-skills 1.4.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.claude-plugin/marketplace.json +49 -1
  2. package/.claude-plugin/plugin.json +5 -1
  3. package/README.md +27 -33
  4. package/bin/install.js +196 -135
  5. package/bundles.json +19 -0
  6. package/package.json +3 -2
  7. package/skills/anysite-audience-analysis/SKILL.md +110 -38
  8. package/skills/anysite-audience-analysis/references/PLATFORM_COVERAGE.md +38 -19
  9. package/skills/anysite-audience-analysis/references/TOOL_MAPPING.md +16 -11
  10. package/skills/anysite-brand-reputation/SKILL.md +105 -43
  11. package/skills/anysite-competitor-analyzer/SKILL.md +170 -111
  12. package/skills/anysite-competitor-intelligence/SKILL.md +201 -116
  13. package/skills/anysite-competitor-intelligence/references/ANALYSIS_PATTERNS.md +17 -13
  14. package/skills/anysite-content-analytics/SKILL.md +101 -33
  15. package/skills/anysite-crm-account-brief/SKILL.md +71 -0
  16. package/skills/anysite-crm-audit/SKILL.md +59 -0
  17. package/skills/anysite-crm-champions/SKILL.md +76 -0
  18. package/skills/anysite-crm-competitor-intel/SKILL.md +74 -0
  19. package/skills/anysite-crm-enrich/SKILL.md +84 -0
  20. package/skills/anysite-crm-lookalikes/SKILL.md +64 -0
  21. package/skills/anysite-crm-prospect/SKILL.md +90 -0
  22. package/skills/anysite-crm-score/SKILL.md +72 -0
  23. package/skills/anysite-crm-setup/SKILL.md +147 -0
  24. package/skills/anysite-crm-signals/SKILL.md +96 -0
  25. package/skills/anysite-influencer-discovery/SKILL.md +123 -71
  26. package/skills/anysite-lead-generation/SKILL.md +288 -256
  27. package/skills/anysite-lead-generation/references/LINKEDIN_STRATEGIES.md +79 -71
  28. package/skills/anysite-lead-generation/references/WEB_SCRAPING.md +121 -87
  29. package/skills/anysite-market-research/SKILL.md +117 -68
  30. package/skills/anysite-mcp/SKILL.md +128 -0
  31. package/skills/anysite-mcp-migration/SKILL.md +19 -8
  32. package/skills/anysite-person-analyzer/SKILL.md +86 -53
  33. package/skills/anysite-trend-analysis/SKILL.md +119 -55
  34. package/skills/anysite-vc-analyst/SKILL.md +12 -2
  35. package/skills/competitor-discovery/SKILL.md +350 -0
  36. package/skills/customer-pain-mining/SKILL.md +318 -0
  37. package/skills/positioning-map/SKILL.md +314 -0
@@ -26,32 +26,54 @@ Comprehensive market research using Y Combinator, SEC, social media, and web dat
26
26
  - ✅ **Twitter/X**: Market pulse, news, influencer opinions
27
27
  - ✅ **Web Scraping**: Company websites, industry reports, market data
28
28
 
29
+ ## v2 MCP Tool Interface
30
+
31
+ All data fetching uses the universal `execute()` meta-tool. Always call `discover(source, category)` first if you need to verify endpoint names or parameters.
32
+
33
+ **Core workflow**:
34
+ 1. `execute(source, category, endpoint, params)` -- fetch data (returns first page + `cache_key`)
35
+ 2. `get_page(cache_key, offset, limit)` -- paginate through remaining results
36
+ 3. `query_cache(cache_key, conditions, sort_by, aggregate, group_by)` -- filter/sort/aggregate cached data without new API calls
37
+ 4. `export_data(cache_key, format)` -- export to CSV, JSON, or JSONL for deliverables
38
+
39
+ **Error handling**: check response for `llm_hint` field -- it contains actionable guidance when calls fail or return partial data.
40
+
29
41
  ## Quick Start
30
42
 
31
43
  **Step 1: Define Research Scope**
32
44
 
33
45
  Choose focus:
34
- - Startup ecosystem: `search_yc_companies`
35
- - Public companies: `sec_search_companies`
36
- - Industry sentiment: `search_reddit_posts`, `search_twitter_posts`
37
- - Company intelligence: `search_linkedin_companies`
46
+ - Startup ecosystem: `execute("yc", "search", "search", {"query": ...})`
47
+ - Public companies: `execute("sec", "search", "search", {"query": ...})`
48
+ - Industry sentiment: `execute("reddit", "search", "search", {"query": ...})`, `execute("twitter", "search", "search_users", {"query": ...})`
49
+ - Company intelligence: `execute("linkedin", "search", "search_companies", {...})`
38
50
 
39
51
  **Step 2: Gather Data**
40
52
 
41
53
  Execute searches:
42
54
  ```
43
55
  # Startup research
44
- search_yc_companies(industries=["fintech"], batches=["W24", "S23"])
56
+ execute("yc", "search", "search", {"query": "fintech", "batch": "W24,S23"})
45
57
 
46
58
  # Public company research
47
- sec_search_companies(entity_name="tech company", forms=["10-K"])
59
+ execute("sec", "search", "search", {"query": "tech company"})
48
60
 
49
61
  # Market sentiment
50
- search_reddit_posts(query="fintech trends", count=100)
62
+ execute("reddit", "search", "search", {"query": "fintech trends"})
63
+ → use get_page(cache_key, offset, limit) to collect up to 100 results
51
64
  ```
52
65
 
53
66
  **Step 3: Analyze Results**
54
67
 
68
+ Use `query_cache()` to slice data without re-fetching:
69
+ ```
70
+ # Count startups by category
71
+ query_cache(cache_key, aggregate={"field": "category", "function": "count"})
72
+
73
+ # Filter high-engagement posts
74
+ query_cache(cache_key, conditions=[{"field": "score", "operator": ">", "value": 50}], sort_by={"field": "score", "order": "desc"})
75
+ ```
76
+
55
77
  Extract insights:
56
78
  - Market size indicators
57
79
  - Competitive landscape
@@ -61,7 +83,7 @@ Extract insights:
61
83
 
62
84
  **Step 4: Synthesize Findings**
63
85
 
64
- Deliver:
86
+ Use `export_data(cache_key, "csv")` or `export_data(cache_key, "json")` to deliver:
65
87
  - Market opportunity assessment
66
88
  - Competitive analysis
67
89
  - Trend identification
@@ -77,17 +99,17 @@ Deliver:
77
99
 
78
100
  1. **Find Startups**
79
101
  ```
80
- search_yc_companies(
81
- industries=["fintech"],
82
- batches=["W24", "S23", "W23", "S22"],
83
- count=100
84
- )
102
+ execute("yc", "search", "search", {
103
+ "query": "fintech",
104
+ "batch": "W24,S23,W23,S22"
105
+ })
106
+ → use get_page(cache_key, offset, limit) to paginate through all results
85
107
  ```
86
108
 
87
109
  2. **Categorize by Focus**
88
110
  ```
89
111
  For each startup:
90
- get_yc_company(company)
112
+ execute("yc", "company", "get", {"slug": company_slug})
91
113
 
92
114
  Group by:
93
115
  - Payments
@@ -96,6 +118,9 @@ Group by:
96
118
  - Banking
97
119
  - Insurance
98
120
  - B2B fintech tools
121
+
122
+ Or use query_cache to group:
123
+ query_cache(cache_key, group_by="category")
99
124
  ```
100
125
 
101
126
  3. **Analyze Patterns**
@@ -105,18 +130,21 @@ Identify:
105
130
  - Team size distribution
106
131
  - Geographic concentration
107
132
  - Common tech stacks (from job postings)
133
+
134
+ Use query_cache for aggregation:
135
+ query_cache(cache_key, aggregate={"field": "team_size", "function": "avg"})
108
136
  ```
109
137
 
110
138
  4. **Research Traction**
111
139
  ```
112
140
  For promising startups:
113
- search_linkedin_companies(keywords=startup_name)
141
+ execute("linkedin", "search", "search_companies", {"keywords": startup_name})
114
142
  → Check employee growth
115
143
 
116
- search_twitter_posts(query=startup_name)
144
+ execute("twitter", "search", "search_users", {"query": startup_name})
117
145
  → Check social presence and buzz
118
146
 
119
- parse_webpage(startup_website)
147
+ execute("webparser", "parse", "parse", {"url": startup_website})
120
148
  → Check positioning and features
121
149
  ```
122
150
 
@@ -136,6 +164,8 @@ Compare:
136
164
  - Market gaps identified
137
165
  - Competitive intensity by segment
138
166
 
167
+ Use `export_data(cache_key, "csv")` to deliver the startup list as a spreadsheet.
168
+
139
169
  ### Workflow 2: Public Company Competitive Analysis
140
170
 
141
171
  **Scenario**: Research public competitors in cloud infrastructure
@@ -144,17 +174,16 @@ Compare:
144
174
 
145
175
  1. **Find Companies**
146
176
  ```
147
- sec_search_companies(
148
- entity_name="cloud",
149
- forms=["10-K", "10-Q"],
150
- count=50
151
- )
177
+ execute("sec", "search", "search", {
178
+ "query": "cloud"
179
+ })
180
+ → use get_page(cache_key, offset, limit) to collect up to 50 results
152
181
  ```
153
182
 
154
183
  2. **Get Financial Data**
155
184
  ```
156
185
  For each company:
157
- sec_document(document_url)
186
+ execute("sec", "document", "get", {"url": document_url})
158
187
 
159
188
  Extract:
160
189
  - Revenue and growth
@@ -185,14 +214,17 @@ Compare year-over-year:
185
214
 
186
215
  5. **Supplement with Social Intel**
187
216
  ```
188
- search_linkedin_companies(keywords=company_name)
217
+ execute("linkedin", "search", "search_companies", {"keywords": company_name})
189
218
  → Employee count, hiring patterns
190
219
 
191
- get_linkedin_company_posts(urn)
192
- Strategic messaging
220
+ execute("linkedin", "company", "get", {"company": company_urn})
221
+ Company details and strategic messaging
193
222
 
194
- search_reddit_posts(query=company_name)
223
+ execute("reddit", "search", "search", {"query": company_name})
195
224
  → Customer sentiment
225
+
226
+ Use query_cache to filter sentiment:
227
+ query_cache(cache_key, conditions=[{"field": "text", "operator": "contains", "value": "review"}])
196
228
  ```
197
229
 
198
230
  **Expected Output**:
@@ -202,6 +234,8 @@ search_reddit_posts(query=company_name)
202
234
  - Growth trajectories
203
235
  - Market opportunities
204
236
 
237
+ Use `export_data(cache_key, "json")` for structured competitive data.
238
+
205
239
  ### Workflow 3: Industry Trend Analysis
206
240
 
207
241
  **Scenario**: Understand AI/ML market evolution
@@ -210,23 +244,25 @@ search_reddit_posts(query=company_name)
210
244
 
211
245
  1. **YC Startup Trends**
212
246
  ```
213
- search_yc_companies(
214
- query="AI OR machine learning OR artificial intelligence",
215
- count=200
216
- )
247
+ execute("yc", "search", "search", {
248
+ "query": "AI OR machine learning OR artificial intelligence"
249
+ })
250
+ → use get_page(cache_key, offset, limit) to collect up to 200 results
217
251
 
218
252
  Group by batch to see:
219
253
  - Trend over time
220
254
  - Focus area shifts
221
255
  - Team size changes
256
+
257
+ query_cache(cache_key, group_by="batch", aggregate={"field": "id", "function": "count"})
222
258
  ```
223
259
 
224
260
  2. **Public Market Signals**
225
261
  ```
226
- sec_search_companies(
227
- entity_name="artificial intelligence",
228
- count=50
229
- )
262
+ execute("sec", "search", "search", {
263
+ "query": "artificial intelligence"
264
+ })
265
+ → use get_page(cache_key, offset, limit) to collect up to 50 results
230
266
 
231
267
  Check 10-K mentions of:
232
268
  - "AI" or "machine learning" frequency
@@ -236,24 +272,25 @@ Check 10-K mentions of:
236
272
 
237
273
  3. **Community Sentiment**
238
274
  ```
239
- search_reddit_posts(
240
- query="AI trends 2026",
241
- count=100
242
- )
275
+ execute("reddit", "search", "search", {
276
+ "query": "AI trends 2026"
277
+ })
278
+ → use get_page(cache_key, offset, limit) to collect up to 100 results
243
279
 
244
280
  Analyze for:
245
281
  - Excitement vs. concern
246
282
  - Adoption barriers
247
283
  - Use case validation
248
284
  - Technology maturity
285
+
286
+ query_cache(cache_key, sort_by={"field": "score", "order": "desc"})
249
287
  ```
250
288
 
251
289
  4. **Professional Discussion**
252
290
  ```
253
- search_linkedin_posts(
254
- keywords="artificial intelligence",
255
- count=50
256
- )
291
+ execute("linkedin", "post", "search_posts", {
292
+ "keywords": "artificial intelligence"
293
+ })
257
294
 
258
295
  Check:
259
296
  - Industry adoption
@@ -265,11 +302,8 @@ Check:
265
302
  5. **Web Intelligence**
266
303
  ```
267
304
  For key AI companies:
268
- parse_webpage(website + "/blog")
269
- → Technology updates, product launches
270
-
271
- get_sitemap(website)
272
- → Content focus areas
305
+ execute("webparser", "parse", "parse", {"url": website + "/blog"})
306
+ → Technology updates, product launches
273
307
  ```
274
308
 
275
309
  **Expected Output**:
@@ -279,42 +313,57 @@ get_sitemap(website)
279
313
  - Opportunity identification
280
314
  - Risk assessment
281
315
 
282
- ## MCP Tools Reference
316
+ Use `export_data(cache_key, "csv")` for trend data tables.
317
+
318
+ ## MCP Tools Reference (v2)
319
+
320
+ ### Data Fetching
321
+ - `execute(source, category, endpoint, params)` -- Universal data fetcher; always returns `cache_key`
322
+
323
+ ### Pagination
324
+ - `get_page(cache_key, offset, limit)` -- Load additional pages from a previous execute()
325
+
326
+ ### Analysis
327
+ - `query_cache(cache_key, conditions, sort_by, aggregate, group_by)` -- Filter, sort, and aggregate cached data
328
+
329
+ ### Export
330
+ - `export_data(cache_key, format)` -- Export to CSV, JSON, or JSONL; returns download URL
283
331
 
284
332
  ### Y Combinator Research
285
- - `search_yc_companies` - Find startups by industry, batch, filters
286
- - `get_yc_company` - Get detailed company profile
287
- - `search_yc_founders` - Research founders
333
+ - `execute("yc", "search", "search", {"query": ...})` -- Find startups by industry, batch, filters
334
+ - `execute("yc", "company", "get", {"slug": ...})` -- Get detailed company profile
288
335
 
289
336
  ### SEC Research
290
- - `sec_search_companies` - Find public companies and filings
291
- - `sec_document` - Get full document content
337
+ - `execute("sec", "search", "search", {"query": ...})` -- Find public companies and filings
338
+ - `execute("sec", "document", "get", {"url": ...})` -- Get full document content
292
339
 
293
340
  ### Social Intelligence
294
- - `search_reddit_posts` - Community insights and sentiment
295
- - `search_twitter_posts` - Real-time market pulse
296
- - `search_linkedin_posts` - Professional trends
341
+ - `execute("reddit", "search", "search", {"query": ...})` -- Community insights and sentiment
342
+ - `execute("twitter", "search", "search_users", {"query": ...})` -- Real-time market pulse
343
+ - `execute("linkedin", "post", "search_posts", {"keywords": ...})` -- Professional trends
297
344
 
298
345
  ### Company Intelligence
299
- - `search_linkedin_companies` - Find companies
300
- - `get_linkedin_company` - Company details
301
- - `parse_webpage` - Extract website data
346
+ - `execute("linkedin", "search", "search_companies", {"keywords": ...})` -- Find companies
347
+ - `execute("linkedin", "company", "get", {"company": ...})` -- Company details
348
+ - `execute("webparser", "parse", "parse", {"url": ...})` -- Extract website data
302
349
 
303
350
  ### Market Discovery
304
- - `duckduckgo_search` - General web research
305
- - `get_sitemap` - Comprehensive website analysis
351
+ - Use `discover(source, category)` to explore available endpoints for any source
352
+ - `execute("webparser", "parse", "parse", {"url": ...})` -- Scrape any URL for market data
353
+
354
+ **Note**: Crunchbase endpoints are disabled in v2. Use LinkedIn company search and Y Combinator data as alternatives for company research.
306
355
 
307
356
  ## Market Analysis Frameworks
308
357
 
309
358
  **TAM/SAM/SOM Analysis**:
310
359
  ```
311
360
  Total Addressable Market (TAM):
312
- - Count YC companies in category × avg market size
361
+ - Count YC companies in category x avg market size
313
362
  - SEC filing market size mentions
314
- - Industry reports (web scraping)
363
+ - Industry reports via execute("webparser", "parse", "parse", {"url": report_url})
315
364
 
316
365
  Serviceable Addressable Market (SAM):
317
- - Filter by geography, segment
366
+ - Filter by geography, segment using query_cache()
318
367
  - LinkedIn company search by ICP
319
368
  - YC companies by batch/stage
320
369
 
@@ -326,7 +375,7 @@ Serviceable Obtainable Market (SOM):
326
375
 
327
376
  **Porter's Five Forces**:
328
377
  ```
329
- Using anysite data:
378
+ Using anysite v2 data:
330
379
 
331
380
  1. Competitive Rivalry:
332
381
  - YC startups in space
@@ -360,12 +409,12 @@ Using anysite data:
360
409
  - Opportunity identification
361
410
  - Strategic recommendations
362
411
 
363
- **CSV Export**:
412
+ **CSV Export** (via `export_data(cache_key, "csv")`):
364
413
  - Company list with metrics
365
414
  - Market segmentation data
366
415
  - Trend indicators
367
416
 
368
- **JSON Export**:
417
+ **JSON Export** (via `export_data(cache_key, "json")`):
369
418
  - Complete research data
370
419
  - Time-series analysis
371
420
  - Cross-platform correlations
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: anysite-mcp
3
+ description: How to use the anysite MCP server effectively - the universal meta-tools (discover, execute, get_page, query_cache, export_data), the source map for GTM signals (funding, hiring, tech stack, reviews, news, launches), email finding cascades, and cost-aware calling patterns. Consult this before any anysite data work. Use when unsure which source or endpoint covers a data need, how to paginate or re-filter cached results, or how to combine sources into a signal chain.
4
+ ---
5
+
6
+ # Anysite MCP — usage guide
7
+
8
+ The anysite MCP exposes hundreds of data sources through five universal meta-tools. This skill
9
+ is the map: how to call them, which sources cover which GTM need, and how to not waste credits.
10
+
11
+ ## The five meta-tools
12
+
13
+ | Tool | Purpose | Credits |
14
+ |---|---|---|
15
+ | `discover(source, category)` | List endpoints + exact params for a source/category | free |
16
+ | `execute(source, category, endpoint, params)` | Run an endpoint; returns first 10 items + `cache_key` | paid |
17
+ | `get_page(cache_key, offset, limit)` | Page through a cached result | free |
18
+ | `query_cache(cache_key, conditions, sort_by, sort_order, aggregate, group_by, limit, offset)` | Filter/sort/aggregate cached data with SQL-like ops | free |
19
+ | `export_data(cache_key, format)` | Export cached data (CSV/JSON) | free |
20
+
21
+ ### Rules that prevent 90% of failures
22
+
23
+ 1. **Always `discover` before `execute`.** Endpoint names and params are not guessable, and a
24
+ wrong source name returns the full source list — a wrong guess self-corrects for free.
25
+ `execute` takes the endpoint NAME exactly as discover returns it (`products_reviews`),
26
+ never a REST path segment (`reviews`) — resolution is an exact-match lookup.
27
+ 2. **Never guess identifiers.** LinkedIn aliases, URNs, Crunchbase aliases, Greenhouse board
28
+ tokens are unpredictable. Resolve them through the search endpoint of the same source first.
29
+ 3. **Re-use the cache.** `execute` returns a `cache_key`; further filtering, sorting, counting
30
+ and paging of that result is free. Never re-run `execute` to look at the same data twice.
31
+ 4. **Cheap-first cascade.** When several endpoints can answer, call the cached/DB one first
32
+ (`*/db/*`, `*sql*` endpoints, ~1 credit) and the live one only for the remainder.
33
+ 5. **Estimate volume before bulk runs.** `N targets × credits-per-call`. Say the number to the
34
+ user before launching anything above ~100 calls.
35
+ 6. **Avoid `gdelt`** — it has repeatedly timed out in practice. Use techmeme or google news
36
+ instead.
37
+
38
+ ## GTM source map
39
+
40
+ **Company discovery (bulk):**
41
+ - `linkedin/search/search_sql_companies` — the workhorse. Up to 1000 companies per call with
42
+ DSL filters (keywords, industry_name, employee_count_min/max, country_hq, founded_on_min/max,
43
+ has_website). Also does batch lookup by `urn` list and search by `website` — use it to
44
+ resolve domains from a CRM into LinkedIn company records.
45
+ - `crunchbase/db/db_search` — filters by funding stage, last funding date, investors,
46
+ employee range; count ≤100, dates as Unix timestamps. 1 credit/result. Response includes
47
+ `funding_rounds[]`, `leadership_hires[]`, `layoffs[]`, `news[]`, `technologies[]`,
48
+ `employees[]`.
49
+ - `crunchbase/search` (live, 20cr/50) — adds `hiring`, `event`, `spotlight`,
50
+ `shares_investors_with`, `it_spend_*`, `revenue_*`, `valuation_*` filters. Check discover
51
+ for its date format — it differs from db_search.
52
+ - `yc/search/search_companies`, `betalist`, `tracxn/companies/companies_search` —
53
+ early-stage supplements (check discover for exact endpoint names before calling).
54
+
55
+ **Company detail:** `crunchbase/company` (by alias — resolve via `crunchbase/search` first),
56
+ `linkedin/company`. Note: `owler` endpoints need an owler alias and its search has no
57
+ name/keyword parameter — not usable for looking up a named account.
58
+
59
+ **People:** `linkedin/search/search_users` (use `job_title` + `current_company` or
60
+ `company_keywords`; never bare `keywords` alone — returns empty), `linkedin/user` (full
61
+ profile, needs alias/URL/URN — never guess the alias), `linkedin/user/user_posts`,
62
+ `user_experience`, `user_comments`.
63
+
64
+ **Email finding (cascade, cheap → expensive):**
65
+ 1. `linkedin/user/user_email` — batch up to 10 profiles, cheap, low yield.
66
+ 2. `linkedin/user/find_email_by_url` — by vanity URL, high yield but expensive (50cr).
67
+ **May be disabled on the server** — trust `discover("linkedin", "user")`: if it is not
68
+ listed there, it does not exist; stop at step 1 and say so honestly.
69
+ 3. No email found → keep the lead anyway; CRM contact upserts match by `linkedin_url` too
70
+ (but note: creating a NEW contact requires an email — no email means update-only).
71
+
72
+ **Reverse lookup (email → person):** `linkedin/email/email_sql_user` (cached DB) →
73
+ `linkedin/email/email_user` (live) for the remainder.
74
+
75
+ **Hiring signals:**
76
+ - `linkedin/search/search_jobs` — by company; works for any company. The `company` param
77
+ takes `[{"type": "company", "value": "<numeric id>"}]` — extract the id from the
78
+ `fsd_company:<id>` URN returned by `search_companies` (raw URN strings are not accepted).
79
+ - `greenhouse/jobs/jobs_search {board_token, count}` — full descriptions via `content=true`;
80
+ `ashby/jobs/jobs_search {board_name, count}` — descriptions always included. Both need the
81
+ company slug; 412 = wrong token, fall back to linkedin jobs.
82
+ - `glassdoor` (resolve employer id via `companies_search` first), `builtin`, `adzuna` —
83
+ supplements; `blind/layoffs/layoffs_search` for layoffs.
84
+
85
+ **Tech stack:** `wappalyzer/technologies` — technology slug → who uses it (`top_websites`
86
+ sample), category alternatives (`alternatives[]`), country/language breakdown. Note: it is a
87
+ sample, not an exhaustive site list.
88
+
89
+ **Software reviews:** `g2/products/products_search` (search only),
90
+ `capterra/products/products_reviews` (includes `switched_from[]` and `switching_reason` —
91
+ direct competitor-switch evidence), `trustradius` and `getapp` `products_reviews`,
92
+ `gartner/products` — competitor review mining. Employer sentiment:
93
+ `glassdoor/companies/companies_ratings` (employer id via `companies_search`), `kununu`,
94
+ `comparably`, `blind/companies/companies_reviews`.
95
+
96
+ **News & mentions:** `techmeme/stories/stories_search {keyword, count}` (archive) and
97
+ `stories_front_page`; `google/news/news_articles_search`;
98
+ `linkedin/search/search_posts` (keyword or `mentioned` company URN; `date_posted` accepts
99
+ only past-24h / past-week / past-month); `reddit`, `hackernews`, `twitter`, `bluesky` for
100
+ community chatter; `substack`/`medium` for content signals.
101
+
102
+ **Launches & products:** `producthunt/launches/launches_search`,
103
+ `producthunt/products/products_alternatives`, `products_reviews`; `indiehackers`,
104
+ `kickstarter`/`indiegogo` for niche ICPs.
105
+
106
+ **Web fallback:** `webparser/parse` (static pages) → `webparser/render` (JS-rendered).
107
+ Covers any URL when no named source fits. Web search: `duckduckgo/search`, `brave/search`.
108
+
109
+ ## Combining into signal chains
110
+
111
+ The standard pattern for account signals (used by the crm-signals skill):
112
+
113
+ ```
114
+ company name/domain
115
+ → crunchbase/search (resolve alias, once; cache it)
116
+ → crunchbase/company → funding_rounds, leadership_hires, news, layoffs
117
+ → linkedin search_jobs(company urn) → what they hire for
118
+ → linkedin search_posts(company name, past-month) → mentions
119
+ ```
120
+
121
+ Stack signals: one signal is a guess, 2–3 signals within ~30 days is a pattern worth acting on.
122
+
123
+ ## Working with CRM
124
+
125
+ CRM read/write goes through the `crm_*` tools, NOT through execute. Before any CRM write,
126
+ consult the `anysite-crm-profile` skill (field mapping law) and the Writing rules in
127
+ `anysite-crm-setup`. The server enforces fill-blank policy, protected fields and write logging
128
+ regardless of what you pass.
@@ -117,14 +117,25 @@ Replace each old tool call using this mapping:
117
117
 
118
118
  If the input references a tool name **not in the mapping above**:
119
119
 
120
- 1. Try to infer the source and category from the tool name
121
- 2. Add a `discover()` call before the `execute()`:
122
- ```
123
- Use discover("{source}", "{category}") to find available endpoints and params.
124
- Then use execute("{source}", "{category}", "{endpoint}", {params}).
125
- ```
126
-
127
- **Important:** Only add `discover()` when the exact endpoint or params are unknown. If the mapping above covers it, use `execute()` directly — no discover needed.
120
+ 1. Try to infer the source and category from the tool name (e.g., `get_instagram_user_friendships` → source `"instagram"`, category `"user"` or `"friendship"`)
121
+ 2. **IMPORTANT: Actually call `discover()` yourself right now** — do NOT leave placeholder `{endpoint}` in the migrated output. Run `discover("{source}", "{category}")` via the MCP tool to get the real endpoint names and parameter schemas.
122
+ 3. If the first category guess returns "Category not found", try alternative categories (e.g., if `"friendship"` fails, try `"user"` — the endpoint may be nested under a different category)
123
+ 4. Once you get the real endpoint list from `discover()`, use the exact endpoint name and params in the migrated `execute()` call
124
+
125
+ **Example — resolving an unknown tool:**
126
+ ```
127
+ Old tool: get_instagram_user_friendships(user, type, count)
128
+ → Not in mapping table
129
+ → You call: discover("instagram", "friendship") → error "Category not found"
130
+ → You call: discover("instagram", "user") → returns endpoints including "user_friendships"
131
+ → Migrated: execute("instagram", "user", "user_friendships", {"user": "...", "count": 100, "type": "followers"})
132
+ ```
133
+
134
+ **Rules:**
135
+ - NEVER leave `discover()` as a placeholder instruction in the final migrated skill. The migrated output must contain exact `execute()` calls with real endpoint names and params.
136
+ - Only include `discover()` in the migrated skill text if the skill's workflow genuinely needs runtime discovery (e.g., the skill works with user-specified sources where the endpoint can't be known at migration time).
137
+ - If the mapping above covers the tool, use `execute()` directly — no discover needed.
138
+ - Run discover for ALL sources and categories used by the skill to verify that endpoint names and params in the mapping table are still accurate.
128
139
 
129
140
  ### Step 5: Add v2 Capabilities
130
141