@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.
- package/.claude-plugin/marketplace.json +49 -1
- package/.claude-plugin/plugin.json +5 -1
- package/README.md +27 -33
- package/bin/install.js +196 -135
- package/bundles.json +19 -0
- package/package.json +3 -2
- package/skills/anysite-audience-analysis/SKILL.md +110 -38
- package/skills/anysite-audience-analysis/references/PLATFORM_COVERAGE.md +38 -19
- package/skills/anysite-audience-analysis/references/TOOL_MAPPING.md +16 -11
- package/skills/anysite-brand-reputation/SKILL.md +105 -43
- package/skills/anysite-competitor-analyzer/SKILL.md +170 -111
- package/skills/anysite-competitor-intelligence/SKILL.md +201 -116
- package/skills/anysite-competitor-intelligence/references/ANALYSIS_PATTERNS.md +17 -13
- package/skills/anysite-content-analytics/SKILL.md +101 -33
- package/skills/anysite-crm-account-brief/SKILL.md +71 -0
- package/skills/anysite-crm-audit/SKILL.md +59 -0
- package/skills/anysite-crm-champions/SKILL.md +76 -0
- package/skills/anysite-crm-competitor-intel/SKILL.md +74 -0
- package/skills/anysite-crm-enrich/SKILL.md +84 -0
- package/skills/anysite-crm-lookalikes/SKILL.md +64 -0
- package/skills/anysite-crm-prospect/SKILL.md +90 -0
- package/skills/anysite-crm-score/SKILL.md +72 -0
- package/skills/anysite-crm-setup/SKILL.md +147 -0
- package/skills/anysite-crm-signals/SKILL.md +96 -0
- package/skills/anysite-influencer-discovery/SKILL.md +123 -71
- package/skills/anysite-lead-generation/SKILL.md +288 -256
- package/skills/anysite-lead-generation/references/LINKEDIN_STRATEGIES.md +79 -71
- package/skills/anysite-lead-generation/references/WEB_SCRAPING.md +121 -87
- package/skills/anysite-market-research/SKILL.md +117 -68
- package/skills/anysite-mcp/SKILL.md +128 -0
- package/skills/anysite-mcp-migration/SKILL.md +19 -8
- package/skills/anysite-person-analyzer/SKILL.md +86 -53
- package/skills/anysite-trend-analysis/SKILL.md +119 -55
- package/skills/anysite-vc-analyst/SKILL.md +12 -2
- package/skills/competitor-discovery/SKILL.md +350 -0
- package/skills/customer-pain-mining/SKILL.md +318 -0
- 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: `
|
|
35
|
-
- Public companies: `
|
|
36
|
-
- Industry sentiment: `
|
|
37
|
-
- Company intelligence: `
|
|
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
|
-
|
|
56
|
+
execute("yc", "search", "search", {"query": "fintech", "batch": "W24,S23"})
|
|
45
57
|
|
|
46
58
|
# Public company research
|
|
47
|
-
|
|
59
|
+
execute("sec", "search", "search", {"query": "tech company"})
|
|
48
60
|
|
|
49
61
|
# Market sentiment
|
|
50
|
-
|
|
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
|
-
|
|
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
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
+
execute("linkedin", "search", "search_companies", {"keywords": startup_name})
|
|
114
142
|
→ Check employee growth
|
|
115
143
|
|
|
116
|
-
|
|
144
|
+
execute("twitter", "search", "search_users", {"query": startup_name})
|
|
117
145
|
→ Check social presence and buzz
|
|
118
146
|
|
|
119
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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
|
-
|
|
217
|
+
execute("linkedin", "search", "search_companies", {"keywords": company_name})
|
|
189
218
|
→ Employee count, hiring patterns
|
|
190
219
|
|
|
191
|
-
|
|
192
|
-
→
|
|
220
|
+
execute("linkedin", "company", "get", {"company": company_urn})
|
|
221
|
+
→ Company details and strategic messaging
|
|
193
222
|
|
|
194
|
-
|
|
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
|
-
|
|
214
|
-
query
|
|
215
|
-
|
|
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
|
-
|
|
227
|
-
|
|
228
|
-
|
|
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
|
-
|
|
240
|
-
query
|
|
241
|
-
|
|
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
|
-
|
|
254
|
-
keywords
|
|
255
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- `
|
|
286
|
-
- `
|
|
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
|
-
- `
|
|
291
|
-
- `
|
|
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
|
-
- `
|
|
295
|
-
- `
|
|
296
|
-
- `
|
|
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
|
-
- `
|
|
300
|
-
- `
|
|
301
|
-
- `
|
|
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
|
-
- `
|
|
305
|
-
- `
|
|
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
|
|
361
|
+
- Count YC companies in category x avg market size
|
|
313
362
|
- SEC filing market size mentions
|
|
314
|
-
- Industry reports (
|
|
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.
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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
|
|