anysite-competitor-analyzer
Deep competitive intelligence combining web scraping, LinkedIn data, social media monitoring, leadership analysis, GitHub activity, Glassdoor sentiment, and community insights. Analyzes founders/C-level profiles, tracks real-time signals vs quarterly reports, and creates comprehensive competitor profiles. Use when asked to analyze competitors, research leadership teams, investigate market positioning, compare products/pricing, assess strategic threats, or gather intelligence on founders and key executives.
What this skill does
# Competitor Analyzer
Systematic framework for gathering and analyzing competitive intelligence using Anysite MCP v2 tools.
## Tool Interface (v2)
All data fetching uses the unified v2 meta-tools:
- **`execute(source, category, endpoint, params)`** - Fetch data. Returns first 10 items + `cache_key`. If `next_offset` is present, use `get_page()` to load more.
- **`get_page(cache_key, offset, limit)`** - Paginate through cached results from a previous `execute()`. Data cached 7 days.
- **`query_cache(cache_key, conditions, sort_by, aggregate, group_by)`** - Filter, sort, count, or aggregate already-fetched data without new API calls.
- **`export_data(cache_key, format)`** - Export full dataset as CSV, JSON, or JSONL. Returns a download URL.
- **`discover(source, category)`** - Inspect available endpoints and params before calling `execute()`.
**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.
## When to Use This Skill
Trigger this skill when users ask to:
- "Analyze [competitor name]"
- "Research our competitors"
- "Create a competitive analysis of [company]"
- "How does [competitor] position themselves?"
- "What are [competitor]'s strengths and weaknesses?"
- "Compare our product with [competitor]"
- "Who are our main competitors?"
- "Build a battle card for [competitor]"
## Quick Start
**For single competitor analysis:**
```bash
# 1. Generate analysis template
python scripts/analyze_competitor.py "Competitor Name" "https://competitor.com"
# 2. Use Anysite v2 tools to gather data (see workflow below)
# 3. Fill in the JSON template with findings
# 4. Generate final report
python scripts/analyze_competitor.py "Competitor Name" "https://competitor.com" | \
python -c "import sys,json; exec('from scripts.analyze_competitor import format_markdown_report; print(format_markdown_report(json.load(sys.stdin)))')" \
> /mnt/user-data/outputs/competitor_report.md
```
## Analysis Workflow
### Phase 1: Foundation (15-20 min)
**Step 1: Initialize Analysis Structure**
Run the analysis script to create structured template:
```bash
python scripts/analyze_competitor.py "Competitor Name" "https://competitor.com" > /tmp/analysis.json
```
**Step 2: Web Presence Reconnaissance**
Scrape key pages to understand positioning:
```python
# Homepage - core messaging
execute("webparser", "parse", "parse", {
"url": "https://competitor.com",
"only_main_content": true,
"strip_all_tags": true
})
# Pricing - cost structure
execute("webparser", "parse", "parse", {
"url": "https://competitor.com/pricing",
"only_main_content": true
})
# About - company background
execute("webparser", "parse", "parse", {
"url": "https://competitor.com/about",
"only_main_content": true,
"extract_contacts": true
})
```
**Extract from homepage:**
- H1/H2 headlines → positioning_statement
- Feature bullets → core_features
- Customer logos → customer_logos
- Value prop → value_proposition
**Extract from pricing:**
- Tier names and prices → pricing.tiers
- Cost per unit → pricing.unit_economics
- Free tier details → pricing.free_tier_limits
- Entry price → pricing.entry_price
**Extract from about:**
- Company description → company_overview.description
- Location → company_overview.headquarters
- Team size hints → company_overview.employee_count
### Phase 2: LinkedIn Intelligence (10-15 min)
**Step 3: Find Company Profile**
```python
# Search for company
execute("linkedin", "search", "search_companies", {
"keywords": "competitor name",
"count": 5
})
# Get detailed profile using slug from search results
execute("linkedin", "company", "company", {
"company": "company-slug-from-search"
})
```
**Extract:**
- `follower_count` → Online presence indicator
- `employee_count` → Company size
- `description` → Self-positioning
- `headquarters` → Location
- `specialties` → Keywords they emphasize
**Step 4: Analyze Team & Growth**
```python
# Check employee growth signals (use search_users with current_company filter)
execute("linkedin", "search", "search_users", {
"current_company": "company-slug",
"keywords": "engineer developer",
"count": 50
})
# Find leadership
execute("linkedin", "search", "search_users", {
"current_company": "company-slug",
"title": "CEO founder",
"count": 10
})
# Get employee stats breakdown (functions, seniority, growth trends)
# First get company URN from company profile, convert fsd_company to company: prefix
execute("linkedin", "company", "company_employee_stats", {
"urn": {"type": "company", "value": "COMPANY_ID_FROM_URN"}
})
```
**Use findings to assess:**
- Team size → growth_indicators.employee_growth
- Eng:sales ratio → GTM strategy signal
- Recent hires → growth phase indicator
**Tip:** Use `query_cache()` on the employee search results to filter by title or sort by relevance without re-fetching:
```python
query_cache(cache_key, conditions=[{"field": "headline", "operator": "contains", "value": "engineer"}])
```
**Step 5: Content Strategy**
```python
# Analyze posting activity
# Use company: prefix URN from the company profile (convert fsd_company:{id} to company:{id})
execute("linkedin", "company", "company_posts", {
"urn": {"type": "company", "value": "COMPANY_ID_FROM_URN"},
"count": 20
})
```
**Analyze posts for:**
- Frequency → content_strategy.blog_frequency
- Themes → content_strategy.key_topics
- Engagement → online_presence.linkedin.engagement_quality
- Tone → content_strategy.tone_of_voice
**Tip:** Use `query_cache()` to aggregate engagement metrics across fetched posts:
```python
query_cache(cache_key, aggregate=[{"field": "comment_count", "function": "avg"}])
```
### Phase 3: Deep Social & Community Research (20-30 min)
**Step 6: Twitter Deep Dive**
**A. Company Account Analysis**
```python
# Get profile stats
execute("twitter", "user", "get", {
"username": "competitor_handle"
})
# Recent activity (analyze more posts)
execute("twitter", "user_tweets", "get", {
"username": "competitor_handle",
"count": 100
})
# If next_offset returned, use get_page() to load more:
# get_page(cache_key, offset=next_offset, limit=50)
```
**Extract from company account:**
- Followers → reach indicator
- Tweet frequency → activity level
- Content mix (product updates, thought leadership, customer engagement)
- Response time to mentions
- Tone of voice
- Most engaging tweets (viral content patterns)
**Tip:** Use `query_cache()` to find top-performing tweets:
```python
query_cache(cache_key, sort_by=[{"field": "favorite_count", "order": "desc"}])
```
**B. Founder/Executive Twitter Presence**
```python
# Find and analyze founder accounts
execute("twitter", "user", "get", {
"username": "founder_handle"
})
execute("twitter", "user_tweets", "get", {
"username": "founder_handle",
"count": 100
})
```
**Leadership Twitter signals:**
- Personal brand strength
- Technical credibility (what they share)
- Customer engagement quality
- Industry thought leadership
- Follower quality (who follows them)
- Retweet patterns (what they amplify)
**C. Brand Mentions & Sentiment**
```python
# Comprehensive mention search
execute("twitter", "search", "search_posts", {
"query": "competitor_name OR @handle OR #competitor_hashtag",
"count": 200
})
# Problem/complaint mentions
execute("twitter", "search", "search_posts", {
"query": "competitor_name (problem OR issue OR bug OR slow OR expensive)",
"count": 100
})
# Positive sentiment
execute("twitter", "search", "search_posts", {
"query": "competitor_name (love OR great OR amazing OR best OR solved)",
"count": 100
})
# Competitive mentions
execute("twitter", "search", "search_posts", {
"query": "competitor_name vs OR competitor_name alternative OR switching from competitor_name",
"count": 100
})
```
**Sentiment scoring:**
```
For each Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.