@anysiteio/agent-skills 1.4.0 → 2.0.0

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 +186 -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
@@ -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
- Anysite:parse_webpage({
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
- Anysite:parse_webpage({
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
- Anysite:parse_webpage({
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
- Anysite:search_linkedin_companies({
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
- Anysite:get_linkedin_company({
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
- Anysite:get_linkedin_company_employees({
121
- "companies": ["company-slug"],
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
- Anysite:get_linkedin_company_employees({
128
- "companies": ["company-slug"],
129
- "keywords": "CEO founder",
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
- Anysite:get_linkedin_company_posts({
144
- "urn": "company-urn-from-profile",
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
- Anysite:get_twitter_user({
163
- "user": "competitor_handle"
191
+ execute("twitter", "user", "get", {
192
+ "username": "competitor_handle"
164
193
  })
165
194
 
166
195
  # Recent activity (analyze more posts)
167
- Anysite:get_twitter_user_posts({
168
- "user": "competitor_handle",
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
- Anysite:get_twitter_user({
185
- "user": "founder_handle"
220
+ execute("twitter", "user", "get", {
221
+ "username": "founder_handle"
186
222
  })
187
223
 
188
- Anysite:get_twitter_user_posts({
189
- "user": "founder_handle",
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
- Anysite:search_twitter_posts({
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
- Anysite:search_twitter_posts({
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
- Anysite:search_twitter_posts({
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
- Anysite:search_twitter_posts({
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
- Anysite:search_twitter_posts({
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
- Anysite:search_twitter_posts({
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
- Anysite:search_reddit_posts({
309
+ execute("reddit", "search", "search_posts", {
269
310
  "query": "competitor_name",
270
311
  "count": 100
271
312
  })
272
313
 
273
- # Industry-specific subreddits
274
- relevant_subs = [
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 sub in relevant_subs:
282
- Anysite:search_reddit_posts({
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
- Anysite:search_reddit_posts({
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
- Anysite:search_reddit_posts({
338
+ execute("reddit", "search", "search_posts", {
299
339
  "query": "alternative to competitor_name",
300
340
  "count": 100
301
341
  })
302
342
 
303
- Anysite:search_reddit_posts({
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
- Anysite:search_reddit_posts({
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
- Anysite:get_reddit_post({
360
+ execute("reddit", "posts", "posts", {
321
361
  "post_url": "reddit.com/r/subreddit/comments/..."
322
362
  })
323
363
 
324
364
  # Get all comments
325
- Anysite:get_reddit_post_comments({
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
- Anysite:search_linkedin_users({
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
- Anysite:get_linkedin_profile({
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
- Anysite:get_linkedin_user_posts({
436
- "urn": "user-urn-from-profile",
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
- Anysite:get_linkedin_user_comments({
442
- "urn": "user-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
- Anysite:get_linkedin_user_reactions({
448
- "urn": "user-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
- Anysite:get_twitter_user({
466
- "user": "founder_handle"
518
+ execute("twitter", "user", "get", {
519
+ "username": "founder_handle"
467
520
  })
468
521
 
469
- Anysite:get_twitter_user_posts({
470
- "user": "founder_handle",
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
- Anysite:parse_webpage({
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
- Anysite:parse_webpage({
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
- Anysite:parse_webpage({
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
- Anysite:parse_webpage({
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
- Anysite:parse_webpage({
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
- Anysite:get_sitemap({
571
- "url": "https://competitor.com/sitemap.xml",
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
- Anysite:parse_webpage({
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
- Anysite:parse_webpage({"url": "competitor.com/pricing"})
726
+ execute("webparser", "parse", "parse", {"url": "https://competitor.com/pricing"})
693
727
 
694
- # 2. Check recent posts
695
- Anysite:get_linkedin_company_posts({"urn": "...", "count": 10})
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
- Anysite:get_linkedin_company_employees({"companies": ["..."], "count": 20})
735
+ execute("linkedin", "search", "search_users", {
736
+ "current_company": "company-slug",
737
+ "count": 20
738
+ })
699
739
 
700
740
  # 4. Recent mentions
701
- Anysite:search_twitter_posts({"query": "competitor", "count": 50})
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
- - Clear positioning statement
814
- - Quantified metrics (prices, follower counts, team size)
815
- - Specific examples (actual quotes, feature lists)
816
- - Strategic implications explained
817
- - Data sources noted
818
- - Confidence levels indicated
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
- - Vague assessments ("they seem good at X")
822
- - Unsupported claims ("probably losing money")
823
- - Missing pricing details
824
- - Outdated data without date stamps
825
- - Pure feature lists without analysis
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