@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
|
@@ -5,7 +5,19 @@ description: Deep competitive intelligence combining web scraping, LinkedIn data
|
|
|
5
5
|
|
|
6
6
|
# Competitor Analyzer
|
|
7
7
|
|
|
8
|
-
Systematic framework for gathering and analyzing competitive intelligence using Anysite MCP tools.
|
|
8
|
+
Systematic framework for gathering and analyzing competitive intelligence using Anysite MCP v2 tools.
|
|
9
|
+
|
|
10
|
+
## Tool Interface (v2)
|
|
11
|
+
|
|
12
|
+
All data fetching uses the unified v2 meta-tools:
|
|
13
|
+
|
|
14
|
+
- **`execute(source, category, endpoint, params)`** - Fetch data. Returns first 10 items + `cache_key`. If `next_offset` is present, use `get_page()` to load more.
|
|
15
|
+
- **`get_page(cache_key, offset, limit)`** - Paginate through cached results from a previous `execute()`. Data cached 7 days.
|
|
16
|
+
- **`query_cache(cache_key, conditions, sort_by, aggregate, group_by)`** - Filter, sort, count, or aggregate already-fetched data without new API calls.
|
|
17
|
+
- **`export_data(cache_key, format)`** - Export full dataset as CSV, JSON, or JSONL. Returns a download URL.
|
|
18
|
+
- **`discover(source, category)`** - Inspect available endpoints and params before calling `execute()`.
|
|
19
|
+
|
|
20
|
+
**Error handling:** If `execute()` returns an error with `llm_hint`, follow the hint to fix the call. Common issues: wrong URN format, alias not found (search first), fsd_company vs company: prefix mismatch.
|
|
9
21
|
|
|
10
22
|
## When to Use This Skill
|
|
11
23
|
|
|
@@ -26,7 +38,7 @@ Trigger this skill when users ask to:
|
|
|
26
38
|
# 1. Generate analysis template
|
|
27
39
|
python scripts/analyze_competitor.py "Competitor Name" "https://competitor.com"
|
|
28
40
|
|
|
29
|
-
# 2. Use Anysite tools to gather data (see workflow below)
|
|
41
|
+
# 2. Use Anysite v2 tools to gather data (see workflow below)
|
|
30
42
|
|
|
31
43
|
# 3. Fill in the JSON template with findings
|
|
32
44
|
|
|
@@ -52,20 +64,20 @@ python scripts/analyze_competitor.py "Competitor Name" "https://competitor.com"
|
|
|
52
64
|
Scrape key pages to understand positioning:
|
|
53
65
|
```python
|
|
54
66
|
# Homepage - core messaging
|
|
55
|
-
|
|
67
|
+
execute("webparser", "parse", "parse", {
|
|
56
68
|
"url": "https://competitor.com",
|
|
57
69
|
"only_main_content": true,
|
|
58
70
|
"strip_all_tags": true
|
|
59
71
|
})
|
|
60
72
|
|
|
61
73
|
# Pricing - cost structure
|
|
62
|
-
|
|
74
|
+
execute("webparser", "parse", "parse", {
|
|
63
75
|
"url": "https://competitor.com/pricing",
|
|
64
76
|
"only_main_content": true
|
|
65
77
|
})
|
|
66
78
|
|
|
67
79
|
# About - company background
|
|
68
|
-
|
|
80
|
+
execute("webparser", "parse", "parse", {
|
|
69
81
|
"url": "https://competitor.com/about",
|
|
70
82
|
"only_main_content": true,
|
|
71
83
|
"extract_contacts": true
|
|
@@ -95,13 +107,13 @@ Anysite:parse_webpage({
|
|
|
95
107
|
|
|
96
108
|
```python
|
|
97
109
|
# Search for company
|
|
98
|
-
|
|
110
|
+
execute("linkedin", "search", "search_companies", {
|
|
99
111
|
"keywords": "competitor name",
|
|
100
112
|
"count": 5
|
|
101
113
|
})
|
|
102
114
|
|
|
103
115
|
# Get detailed profile using slug from search results
|
|
104
|
-
|
|
116
|
+
execute("linkedin", "company", "company", {
|
|
105
117
|
"company": "company-slug-from-search"
|
|
106
118
|
})
|
|
107
119
|
```
|
|
@@ -116,19 +128,25 @@ Anysite:get_linkedin_company({
|
|
|
116
128
|
**Step 4: Analyze Team & Growth**
|
|
117
129
|
|
|
118
130
|
```python
|
|
119
|
-
# Check employee growth signals
|
|
120
|
-
|
|
121
|
-
"
|
|
131
|
+
# Check employee growth signals (use search_users with current_company filter)
|
|
132
|
+
execute("linkedin", "search", "search_users", {
|
|
133
|
+
"current_company": "company-slug",
|
|
122
134
|
"keywords": "engineer developer",
|
|
123
135
|
"count": 50
|
|
124
136
|
})
|
|
125
137
|
|
|
126
138
|
# Find leadership
|
|
127
|
-
|
|
128
|
-
"
|
|
129
|
-
"
|
|
139
|
+
execute("linkedin", "search", "search_users", {
|
|
140
|
+
"current_company": "company-slug",
|
|
141
|
+
"title": "CEO founder",
|
|
130
142
|
"count": 10
|
|
131
143
|
})
|
|
144
|
+
|
|
145
|
+
# Get employee stats breakdown (functions, seniority, growth trends)
|
|
146
|
+
# First get company URN from company profile, convert fsd_company to company: prefix
|
|
147
|
+
execute("linkedin", "company", "company_employee_stats", {
|
|
148
|
+
"urn": {"type": "company", "value": "COMPANY_ID_FROM_URN"}
|
|
149
|
+
})
|
|
132
150
|
```
|
|
133
151
|
|
|
134
152
|
**Use findings to assess:**
|
|
@@ -136,12 +154,18 @@ Anysite:get_linkedin_company_employees({
|
|
|
136
154
|
- Eng:sales ratio → GTM strategy signal
|
|
137
155
|
- Recent hires → growth phase indicator
|
|
138
156
|
|
|
157
|
+
**Tip:** Use `query_cache()` on the employee search results to filter by title or sort by relevance without re-fetching:
|
|
158
|
+
```python
|
|
159
|
+
query_cache(cache_key, conditions=[{"field": "headline", "operator": "contains", "value": "engineer"}])
|
|
160
|
+
```
|
|
161
|
+
|
|
139
162
|
**Step 5: Content Strategy**
|
|
140
163
|
|
|
141
164
|
```python
|
|
142
165
|
# Analyze posting activity
|
|
143
|
-
|
|
144
|
-
|
|
166
|
+
# Use company: prefix URN from the company profile (convert fsd_company:{id} to company:{id})
|
|
167
|
+
execute("linkedin", "company", "company_posts", {
|
|
168
|
+
"urn": {"type": "company", "value": "COMPANY_ID_FROM_URN"},
|
|
145
169
|
"count": 20
|
|
146
170
|
})
|
|
147
171
|
```
|
|
@@ -152,6 +176,11 @@ Anysite:get_linkedin_company_posts({
|
|
|
152
176
|
- Engagement → online_presence.linkedin.engagement_quality
|
|
153
177
|
- Tone → content_strategy.tone_of_voice
|
|
154
178
|
|
|
179
|
+
**Tip:** Use `query_cache()` to aggregate engagement metrics across fetched posts:
|
|
180
|
+
```python
|
|
181
|
+
query_cache(cache_key, aggregate=[{"field": "comment_count", "function": "avg"}])
|
|
182
|
+
```
|
|
183
|
+
|
|
155
184
|
### Phase 3: Deep Social & Community Research (20-30 min)
|
|
156
185
|
|
|
157
186
|
**Step 6: Twitter Deep Dive**
|
|
@@ -159,15 +188,17 @@ Anysite:get_linkedin_company_posts({
|
|
|
159
188
|
**A. Company Account Analysis**
|
|
160
189
|
```python
|
|
161
190
|
# Get profile stats
|
|
162
|
-
|
|
163
|
-
"
|
|
191
|
+
execute("twitter", "user", "get", {
|
|
192
|
+
"username": "competitor_handle"
|
|
164
193
|
})
|
|
165
194
|
|
|
166
195
|
# Recent activity (analyze more posts)
|
|
167
|
-
|
|
168
|
-
"
|
|
196
|
+
execute("twitter", "user_tweets", "get", {
|
|
197
|
+
"username": "competitor_handle",
|
|
169
198
|
"count": 100
|
|
170
199
|
})
|
|
200
|
+
# If next_offset returned, use get_page() to load more:
|
|
201
|
+
# get_page(cache_key, offset=next_offset, limit=50)
|
|
171
202
|
```
|
|
172
203
|
|
|
173
204
|
**Extract from company account:**
|
|
@@ -178,15 +209,20 @@ Anysite:get_twitter_user_posts({
|
|
|
178
209
|
- Tone of voice
|
|
179
210
|
- Most engaging tweets (viral content patterns)
|
|
180
211
|
|
|
212
|
+
**Tip:** Use `query_cache()` to find top-performing tweets:
|
|
213
|
+
```python
|
|
214
|
+
query_cache(cache_key, sort_by=[{"field": "favorite_count", "order": "desc"}])
|
|
215
|
+
```
|
|
216
|
+
|
|
181
217
|
**B. Founder/Executive Twitter Presence**
|
|
182
218
|
```python
|
|
183
219
|
# Find and analyze founder accounts
|
|
184
|
-
|
|
185
|
-
"
|
|
220
|
+
execute("twitter", "user", "get", {
|
|
221
|
+
"username": "founder_handle"
|
|
186
222
|
})
|
|
187
223
|
|
|
188
|
-
|
|
189
|
-
"
|
|
224
|
+
execute("twitter", "user_tweets", "get", {
|
|
225
|
+
"username": "founder_handle",
|
|
190
226
|
"count": 100
|
|
191
227
|
})
|
|
192
228
|
```
|
|
@@ -202,25 +238,25 @@ Anysite:get_twitter_user_posts({
|
|
|
202
238
|
**C. Brand Mentions & Sentiment**
|
|
203
239
|
```python
|
|
204
240
|
# Comprehensive mention search
|
|
205
|
-
|
|
241
|
+
execute("twitter", "search", "search_posts", {
|
|
206
242
|
"query": "competitor_name OR @handle OR #competitor_hashtag",
|
|
207
243
|
"count": 200
|
|
208
244
|
})
|
|
209
245
|
|
|
210
246
|
# Problem/complaint mentions
|
|
211
|
-
|
|
247
|
+
execute("twitter", "search", "search_posts", {
|
|
212
248
|
"query": "competitor_name (problem OR issue OR bug OR slow OR expensive)",
|
|
213
249
|
"count": 100
|
|
214
250
|
})
|
|
215
251
|
|
|
216
252
|
# Positive sentiment
|
|
217
|
-
|
|
253
|
+
execute("twitter", "search", "search_posts", {
|
|
218
254
|
"query": "competitor_name (love OR great OR amazing OR best OR solved)",
|
|
219
255
|
"count": 100
|
|
220
256
|
})
|
|
221
257
|
|
|
222
258
|
# Competitive mentions
|
|
223
|
-
|
|
259
|
+
execute("twitter", "search", "search_posts", {
|
|
224
260
|
"query": "competitor_name vs OR competitor_name alternative OR switching from competitor_name",
|
|
225
261
|
"count": 100
|
|
226
262
|
})
|
|
@@ -238,16 +274,21 @@ Sentiment Score = (Positive - Negative) / Total
|
|
|
238
274
|
Range: -1.0 (very negative) to +1.0 (very positive)
|
|
239
275
|
```
|
|
240
276
|
|
|
277
|
+
**Tip:** Use `query_cache()` to filter cached mentions by sentiment keywords without re-fetching:
|
|
278
|
+
```python
|
|
279
|
+
query_cache(cache_key, conditions=[{"field": "text", "operator": "contains", "value": "love"}])
|
|
280
|
+
```
|
|
281
|
+
|
|
241
282
|
**D. Customer Voice Analysis**
|
|
242
283
|
```python
|
|
243
284
|
# Find actual users
|
|
244
|
-
|
|
285
|
+
execute("twitter", "search", "search_posts", {
|
|
245
286
|
"query": "using competitor_name OR tried competitor_name",
|
|
246
287
|
"count": 100
|
|
247
288
|
})
|
|
248
289
|
|
|
249
290
|
# Power users
|
|
250
|
-
|
|
291
|
+
execute("twitter", "search", "search_posts", {
|
|
251
292
|
"query": "@handle thanks OR @handle helped OR @handle support",
|
|
252
293
|
"count": 50
|
|
253
294
|
})
|
|
@@ -265,23 +306,22 @@ Anysite:search_twitter_posts({
|
|
|
265
306
|
**A. Brand Presence Mapping**
|
|
266
307
|
```python
|
|
267
308
|
# General mentions across Reddit
|
|
268
|
-
|
|
309
|
+
execute("reddit", "search", "search_posts", {
|
|
269
310
|
"query": "competitor_name",
|
|
270
311
|
"count": 100
|
|
271
312
|
})
|
|
272
313
|
|
|
273
|
-
# Industry-specific
|
|
274
|
-
|
|
314
|
+
# Industry-specific searches (combine with subreddit keywords)
|
|
315
|
+
relevant_topics = [
|
|
275
316
|
"SaaS", "startups", "Entrepreneur", # Business
|
|
276
317
|
"webdev", "programming", "devops", # Tech
|
|
277
318
|
"nocode", "automation", # No-code
|
|
278
319
|
"datascience", "analytics" # Data
|
|
279
320
|
]
|
|
280
321
|
|
|
281
|
-
for
|
|
282
|
-
|
|
283
|
-
"query": "competitor_name",
|
|
284
|
-
"subreddit": sub,
|
|
322
|
+
for topic in relevant_topics:
|
|
323
|
+
execute("reddit", "search", "search_posts", {
|
|
324
|
+
"query": f"competitor_name {topic}",
|
|
285
325
|
"count": 50
|
|
286
326
|
})
|
|
287
327
|
```
|
|
@@ -289,24 +329,24 @@ for sub in relevant_subs:
|
|
|
289
329
|
**B. Competitive Discussions**
|
|
290
330
|
```python
|
|
291
331
|
# Direct comparisons
|
|
292
|
-
|
|
332
|
+
execute("reddit", "search", "search_posts", {
|
|
293
333
|
"query": "competitor_name vs",
|
|
294
334
|
"count": 100
|
|
295
335
|
})
|
|
296
336
|
|
|
297
337
|
# Alternative searches
|
|
298
|
-
|
|
338
|
+
execute("reddit", "search", "search_posts", {
|
|
299
339
|
"query": "alternative to competitor_name",
|
|
300
340
|
"count": 100
|
|
301
341
|
})
|
|
302
342
|
|
|
303
|
-
|
|
343
|
+
execute("reddit", "search", "search_posts", {
|
|
304
344
|
"query": "better than competitor_name",
|
|
305
345
|
"count": 50
|
|
306
346
|
})
|
|
307
347
|
|
|
308
348
|
# Problem space
|
|
309
|
-
|
|
349
|
+
execute("reddit", "search", "search_posts", {
|
|
310
350
|
"query": "[problem they solve] tools OR solutions",
|
|
311
351
|
"count": 100
|
|
312
352
|
})
|
|
@@ -317,12 +357,12 @@ Anysite:search_reddit_posts({
|
|
|
317
357
|
For high-engagement threads, get comments:
|
|
318
358
|
```python
|
|
319
359
|
# Get specific post details
|
|
320
|
-
|
|
360
|
+
execute("reddit", "posts", "posts", {
|
|
321
361
|
"post_url": "reddit.com/r/subreddit/comments/..."
|
|
322
362
|
})
|
|
323
363
|
|
|
324
364
|
# Get all comments
|
|
325
|
-
|
|
365
|
+
execute("reddit", "posts", "posts_comments", {
|
|
326
366
|
"post_url": "reddit.com/r/subreddit/comments/..."
|
|
327
367
|
})
|
|
328
368
|
```
|
|
@@ -335,6 +375,11 @@ Anysite:get_reddit_post_comments({
|
|
|
335
375
|
- Customer support experiences
|
|
336
376
|
- Decision factors (why they chose/didn't choose)
|
|
337
377
|
|
|
378
|
+
**Tip:** Use `query_cache()` on fetched comments to sort by score and find the most upvoted opinions:
|
|
379
|
+
```python
|
|
380
|
+
query_cache(cache_key, sort_by=[{"field": "score", "order": "desc"}])
|
|
381
|
+
```
|
|
382
|
+
|
|
338
383
|
**D. Sentiment & Voice Analysis**
|
|
339
384
|
|
|
340
385
|
**Positive signals:**
|
|
@@ -405,14 +450,14 @@ Community Health:
|
|
|
405
450
|
|
|
406
451
|
```python
|
|
407
452
|
# Find founders and C-level
|
|
408
|
-
|
|
453
|
+
execute("linkedin", "search", "search_users", {
|
|
409
454
|
"company_keywords": "competitor-name",
|
|
410
455
|
"title": "founder OR CEO OR CTO OR CPO",
|
|
411
456
|
"count": 10
|
|
412
457
|
})
|
|
413
458
|
|
|
414
459
|
# Get detailed profiles
|
|
415
|
-
|
|
460
|
+
execute("linkedin", "user", "user", {
|
|
416
461
|
"user": "founder-linkedin-username",
|
|
417
462
|
"with_experience": true,
|
|
418
463
|
"with_education": true,
|
|
@@ -431,21 +476,21 @@ Anysite:get_linkedin_profile({
|
|
|
431
476
|
**Step 9: Analyze Leadership Activity**
|
|
432
477
|
|
|
433
478
|
```python
|
|
434
|
-
# Get personal posts
|
|
435
|
-
|
|
436
|
-
"urn": "
|
|
479
|
+
# Get personal posts (use fsd_profile URN from user profile)
|
|
480
|
+
execute("linkedin", "user", "user_posts", {
|
|
481
|
+
"urn": {"type": "fsd_profile", "value": "USER_URN_VALUE"},
|
|
437
482
|
"count": 50
|
|
438
483
|
})
|
|
439
484
|
|
|
440
485
|
# Check comments on others' posts
|
|
441
|
-
|
|
442
|
-
"urn": "
|
|
486
|
+
execute("linkedin", "user", "user_comments", {
|
|
487
|
+
"urn": {"type": "fsd_profile", "value": "USER_URN_VALUE"},
|
|
443
488
|
"count": 30
|
|
444
489
|
})
|
|
445
490
|
|
|
446
491
|
# See what they're engaging with
|
|
447
|
-
|
|
448
|
-
"urn": "
|
|
492
|
+
execute("linkedin", "user", "user_reactions", {
|
|
493
|
+
"urn": {"type": "fsd_profile", "value": "USER_URN_VALUE"},
|
|
449
494
|
"count": 50
|
|
450
495
|
})
|
|
451
496
|
```
|
|
@@ -458,16 +503,24 @@ Anysite:get_linkedin_user_reactions({
|
|
|
458
503
|
- Thought leadership quality
|
|
459
504
|
- Network quality (who engages with them)
|
|
460
505
|
|
|
506
|
+
**Tip:** Use `query_cache()` on leadership posts to aggregate engagement:
|
|
507
|
+
```python
|
|
508
|
+
query_cache(cache_key, aggregate=[
|
|
509
|
+
{"field": "comment_count", "function": "avg"},
|
|
510
|
+
{"field": "comment_count", "function": "sum"}
|
|
511
|
+
])
|
|
512
|
+
```
|
|
513
|
+
|
|
461
514
|
**Step 10: Twitter Leadership Presence**
|
|
462
515
|
|
|
463
516
|
```python
|
|
464
517
|
# Founder Twitter activity
|
|
465
|
-
|
|
466
|
-
"
|
|
518
|
+
execute("twitter", "user", "get", {
|
|
519
|
+
"username": "founder_handle"
|
|
467
520
|
})
|
|
468
521
|
|
|
469
|
-
|
|
470
|
-
"
|
|
522
|
+
execute("twitter", "user_tweets", "get", {
|
|
523
|
+
"username": "founder_handle",
|
|
471
524
|
"count": 100
|
|
472
525
|
})
|
|
473
526
|
```
|
|
@@ -486,29 +539,13 @@ Anysite:get_twitter_user_posts({
|
|
|
486
539
|
|
|
487
540
|
```python
|
|
488
541
|
# Scrape docs homepage
|
|
489
|
-
|
|
542
|
+
execute("webparser", "parse", "parse", {
|
|
490
543
|
"url": "https://competitor.com/docs",
|
|
491
544
|
"only_main_content": true
|
|
492
545
|
})
|
|
493
546
|
|
|
494
547
|
# Check API reference
|
|
495
|
-
|
|
496
|
-
"url": "https://competitor.com/api",
|
|
497
|
-
"only_main_content": true
|
|
498
|
-
})
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
**Step 11: Documentation Quality**
|
|
502
|
-
|
|
503
|
-
```python
|
|
504
|
-
# Scrape docs homepage
|
|
505
|
-
Anysite:parse_webpage({
|
|
506
|
-
"url": "https://competitor.com/docs",
|
|
507
|
-
"only_main_content": true
|
|
508
|
-
})
|
|
509
|
-
|
|
510
|
-
# Check API reference
|
|
511
|
-
Anysite:parse_webpage({
|
|
548
|
+
execute("webparser", "parse", "parse", {
|
|
512
549
|
"url": "https://competitor.com/api",
|
|
513
550
|
"only_main_content": true
|
|
514
551
|
})
|
|
@@ -525,13 +562,13 @@ Anysite:parse_webpage({
|
|
|
525
562
|
|
|
526
563
|
```python
|
|
527
564
|
# Parse GitHub profile page
|
|
528
|
-
|
|
565
|
+
execute("webparser", "parse", "parse", {
|
|
529
566
|
"url": "https://github.com/competitor-org",
|
|
530
567
|
"only_main_content": true
|
|
531
568
|
})
|
|
532
569
|
|
|
533
570
|
# Check main repository
|
|
534
|
-
|
|
571
|
+
execute("webparser", "parse", "parse", {
|
|
535
572
|
"url": "https://github.com/competitor-org/main-repo",
|
|
536
573
|
"only_main_content": true
|
|
537
574
|
})
|
|
@@ -549,7 +586,7 @@ Anysite:parse_webpage({
|
|
|
549
586
|
|
|
550
587
|
```python
|
|
551
588
|
# Glassdoor reviews (if company page exists)
|
|
552
|
-
|
|
589
|
+
execute("webparser", "parse", "parse", {
|
|
553
590
|
"url": "https://www.glassdoor.com/Reviews/competitor-name",
|
|
554
591
|
"only_main_content": true
|
|
555
592
|
})
|
|
@@ -567,29 +604,13 @@ Anysite:parse_webpage({
|
|
|
567
604
|
|
|
568
605
|
```python
|
|
569
606
|
# Get sitemap to find all pages
|
|
570
|
-
|
|
571
|
-
"url": "https://competitor.com
|
|
572
|
-
"count": 50
|
|
573
|
-
})
|
|
574
|
-
|
|
575
|
-
# Parse integrations page
|
|
576
|
-
Anysite:parse_webpage({
|
|
577
|
-
"url": "https://competitor.com/integrations",
|
|
578
|
-
"only_main_content": true
|
|
579
|
-
})
|
|
580
|
-
```
|
|
581
|
-
|
|
582
|
-
**Step 14: Integration Ecosystem**
|
|
583
|
-
|
|
584
|
-
```python
|
|
585
|
-
# Get sitemap to find all pages
|
|
586
|
-
Anysite:get_sitemap({
|
|
587
|
-
"url": "https://competitor.com/sitemap.xml",
|
|
607
|
+
execute("webparser", "sitemap", "sitemap", {
|
|
608
|
+
"url": "https://competitor.com",
|
|
588
609
|
"count": 50
|
|
589
610
|
})
|
|
590
611
|
|
|
591
612
|
# Parse integrations page
|
|
592
|
-
|
|
613
|
+
execute("webparser", "parse", "parse", {
|
|
593
614
|
"url": "https://competitor.com/integrations",
|
|
594
615
|
"only_main_content": true
|
|
595
616
|
})
|
|
@@ -668,6 +689,12 @@ cp /tmp/analysis.json /mnt/user-data/outputs/
|
|
|
668
689
|
cp /tmp/analysis.md /mnt/user-data/outputs/
|
|
669
690
|
```
|
|
670
691
|
|
|
692
|
+
**Tip:** Use `export_data()` to export any collected dataset for the final report:
|
|
693
|
+
```python
|
|
694
|
+
export_data(cache_key, "csv") # Returns download URL for spreadsheet import
|
|
695
|
+
export_data(cache_key, "json") # Returns download URL for programmatic use
|
|
696
|
+
```
|
|
697
|
+
|
|
671
698
|
## Advanced Techniques
|
|
672
699
|
|
|
673
700
|
### Multi-Competitor Analysis
|
|
@@ -682,6 +709,13 @@ For analyzing 3-5 competitors simultaneously:
|
|
|
682
709
|
- Market position map (price vs capabilities)
|
|
683
710
|
- Social presence comparison
|
|
684
711
|
|
|
712
|
+
**Tip:** Export each competitor's data and use `query_cache()` to compare metrics:
|
|
713
|
+
```python
|
|
714
|
+
# After fetching data for each competitor, aggregate and compare
|
|
715
|
+
query_cache(cache_key, aggregate=[{"field": "follower_count", "function": "sum"}])
|
|
716
|
+
export_data(cache_key, "csv")
|
|
717
|
+
```
|
|
718
|
+
|
|
685
719
|
### Ongoing Monitoring
|
|
686
720
|
|
|
687
721
|
For quarterly updates (not full re-analysis):
|
|
@@ -689,16 +723,25 @@ For quarterly updates (not full re-analysis):
|
|
|
689
723
|
**Quick check (30 min):**
|
|
690
724
|
```python
|
|
691
725
|
# 1. Re-scrape pricing
|
|
692
|
-
|
|
726
|
+
execute("webparser", "parse", "parse", {"url": "https://competitor.com/pricing"})
|
|
693
727
|
|
|
694
|
-
# 2. Check recent posts
|
|
695
|
-
|
|
728
|
+
# 2. Check recent posts (use company: prefix URN)
|
|
729
|
+
execute("linkedin", "company", "company_posts", {
|
|
730
|
+
"urn": {"type": "company", "value": "COMPANY_ID"},
|
|
731
|
+
"count": 10
|
|
732
|
+
})
|
|
696
733
|
|
|
697
734
|
# 3. Employee growth
|
|
698
|
-
|
|
735
|
+
execute("linkedin", "search", "search_users", {
|
|
736
|
+
"current_company": "company-slug",
|
|
737
|
+
"count": 20
|
|
738
|
+
})
|
|
699
739
|
|
|
700
740
|
# 4. Recent mentions
|
|
701
|
-
|
|
741
|
+
execute("twitter", "search", "search_posts", {
|
|
742
|
+
"query": "competitor",
|
|
743
|
+
"count": 50
|
|
744
|
+
})
|
|
702
745
|
```
|
|
703
746
|
|
|
704
747
|
Update only changed sections in JSON template.
|
|
@@ -807,22 +850,28 @@ For founder/team intelligence:
|
|
|
807
850
|
- Mark which data is recent vs stale
|
|
808
851
|
- Plan update frequency based on importance
|
|
809
852
|
|
|
853
|
+
**Use v2 Efficiency Features:**
|
|
854
|
+
- Use `get_page()` instead of re-executing with higher counts
|
|
855
|
+
- Use `query_cache()` to filter/sort/aggregate without new API calls
|
|
856
|
+
- Use `export_data()` to generate shareable CSV/JSON files
|
|
857
|
+
- Check `llm_hint` in error responses for fix guidance
|
|
858
|
+
|
|
810
859
|
## Output Quality Standards
|
|
811
860
|
|
|
812
861
|
**Good competitive analysis includes:**
|
|
813
|
-
-
|
|
814
|
-
-
|
|
815
|
-
-
|
|
816
|
-
-
|
|
817
|
-
-
|
|
818
|
-
-
|
|
862
|
+
- Clear positioning statement
|
|
863
|
+
- Quantified metrics (prices, follower counts, team size)
|
|
864
|
+
- Specific examples (actual quotes, feature lists)
|
|
865
|
+
- Strategic implications explained
|
|
866
|
+
- Data sources noted
|
|
867
|
+
- Confidence levels indicated
|
|
819
868
|
|
|
820
869
|
**Avoid:**
|
|
821
|
-
-
|
|
822
|
-
-
|
|
823
|
-
-
|
|
824
|
-
-
|
|
825
|
-
-
|
|
870
|
+
- Vague assessments ("they seem good at X")
|
|
871
|
+
- Unsupported claims ("probably losing money")
|
|
872
|
+
- Missing pricing details
|
|
873
|
+
- Outdated data without date stamps
|
|
874
|
+
- Pure feature lists without analysis
|
|
826
875
|
|
|
827
876
|
## Troubleshooting
|
|
828
877
|
|
|
@@ -845,3 +894,13 @@ For founder/team intelligence:
|
|
|
845
894
|
- Start with Phase 1 & 2 only (foundation + LinkedIn)
|
|
846
895
|
- Generate partial report
|
|
847
896
|
- Add Phase 3 & 4 if needed for depth
|
|
897
|
+
|
|
898
|
+
**"execute() returned error with llm_hint":**
|
|
899
|
+
- Read the hint carefully and adjust params
|
|
900
|
+
- Common: wrong URN format (use company: prefix, not fsd_company)
|
|
901
|
+
- Common: alias not found (use search endpoint first)
|
|
902
|
+
|
|
903
|
+
**"Need more than 10 results from execute()":**
|
|
904
|
+
- Check if response includes `next_offset`
|
|
905
|
+
- Use `get_page(cache_key, offset=next_offset, limit=50)` to load more
|
|
906
|
+
- Do NOT re-execute with a higher count — use pagination
|