Back to skills
SKILL.md
Brand Competition
ASecurityCompetitive intelligence analysis comparing a brand against competitors using XPOZ MCP. Analyzes share of voice, sentiment comparison, and competitive positioning. Use when asked to "compare X vs Y", "competitive analysis", or "how does X stack up against competitors".
- 9 stars
- 0 votes
- 0 copies
- 1 view
- Added August 30, 2026
Works with
Security analysis
100/100npx -y skills add XPOZpublic/xpoz-claude-code-plugins --skill brand-competition --agent claude-codeAre you the author of Brand Competition?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/xpozpublic-brand-competition)---
name: brand-competition
version: 2025-01-13
description: Competitive intelligence analysis comparing a brand against competitors using XPOZ MCP. Analyzes share of voice, sentiment comparison, and competitive positioning. Use when asked to "compare X vs Y", "competitive analysis", or "how does X stack up against competitors".
---
# Brand Competition Skill
## Overview
This skill provides competitive intelligence by analyzing a brand against its competitors. It compares sentiment scores, share of voice, narratives, and positioning across multiple companies using real Twitter/X data.
## When to Use
Activate this skill when the user asks about:
- "Compare [BRAND] vs [COMPETITORS]"
- "Competitive analysis for [BRAND]"
- "How does [BRAND] stack up against competitors?"
- "[BRAND] vs [COMPETITOR] sentiment"
- "Market positioning for [BRAND]"
- "Share of voice analysis"
## XPOZ MCP Data Flow
### Step 1: Identify Competitors
If competitors are provided, use them. Otherwise, auto-discover based on industry:
| Brand | Auto-Discovered Competitors |
|-------|----------------------------|
| NVIDIA | AMD, Intel, Broadcom |
| Tesla | Rivian, BYD, Lucid |
| Apple | Samsung, Google, Microsoft |
| Nike | Adidas, Puma, Under Armour |
| McDonald's | Burger King, Wendy's, KFC |
| Coca-Cola | Pepsi, Dr Pepper, Monster |
### Step 2: Query Expansion (CRITICAL!)
Expand each brand name to include ticker symbols:
```
NVIDIA → "NVIDIA" OR "$NVDA"
AMD → "AMD" OR "$AMD"
Intel → "Intel" OR "$INTC"
```
### Step 3: Fetch Data for Each Company
For **each company** (brand + 2-3 competitors):
```
Use getTwitterPostsByKeywords with:
- query: Expanded query for each company
- fields: ["id", "text", "authorUsername", "createdAtDate", "likeCount", "retweetCount"]
- startDate/endDate: Last 7 days
- userPrompt: "Fetching tweets about [COMPANY] for competitive analysis"
```
**CRITICAL: Async Polling Pattern**
1. The API returns an `operationId`
2. Call `checkOperationStatus` with that operationId
3. Poll until status is "completed" (up to 8 times, ~5 seconds between)
### Step 4: Fetch Cross-Company Influencers
Find influencers who mention multiple companies:
```
Use getTwitterUsersByKeywords with:
- query: "NVIDIA" OR "AMD" OR "Intel" (all companies combined)
- fields: ["id", "username", "name", "followersCount", "description"]
```
### Step 5: Calculate Metrics
**Share of Voice:**
```
company_share = company_tweets / total_tweets * 100
```
**Sentiment Comparison (5-Level Scale):**
- Classify tweets using 5-level scale: positive, leaning_positive, neutral, leaning_negative, negative
- Calculate sentiment score (0-100) for each company using weighted formula
- Compare percentage breakdown across all 5 sentiment levels
- Higher weight for positive content, penalty for negative mentions
**Competitive Positioning:**
- Identify strengths/weaknesses for each
- Compare narratives across companies
## Output Requirements
### JSON Schema
```json
{
"reportType": "competition",
"brand": "NVIDIA",
"competitors": ["AMD", "Intel"],
"period": {
"days": 7,
"startDate": "2025-01-06",
"endDate": "2025-01-13"
},
"summary": {
"headline": "NVIDIA Leads AI Chip Race (max 10 words)",
"insight": "Key competitive insight in max 20 words",
"analysts_view": "2-3 sentence competitive analysis with citations"
},
"analysts_cited": ["Dan Ives (Wedbush)", "Patrick Moorhead (Moor Insights)"],
"shareOfVoice": {
"NVIDIA": 55,
"AMD": 30,
"Intel": 15
},
"companies": [
{
"name": "NVIDIA",
"type": "brand",
"tweetCount": 245,
"sentiment_score": 72,
"positive_pct": 45,
"negative_pct": 18,
"narratives": [
{ "title": "AI Infrastructure Dominance", "sentiment": "positive", "detail": "..." }
],
"strengths": ["Market leadership", "CUDA ecosystem"],
"weaknesses": ["High valuation", "Supply constraints"],
"key_quote": "@user: Actual tweet..."
},
{
"name": "AMD",
"type": "competitor",
"tweetCount": 134,
"sentiment_score": 58,
"positive_pct": 38,
"negative_pct": 25,
"narratives": [...],
"strengths": [...],
"weaknesses": [...],
"key_quote": "..."
}
],
"influencers": [
{
"username": "@tech_analyst",
"name": "Tech Analyst",
"followers": 125000,
"sentiment": "neutral",
"companies_mentioned": ["NVIDIA", "AMD"],
"sample_tweet": { "text": "...", "likes": 500, "retweets": 50 }
}
],
"competitiveInsights": {
"leader": "NVIDIA",
"challenger": "AMD",
"key_battleground": "Data center AI accelerators"
}
}
```
### HTML Report Output
Generate a standalone HTML report with:
- Tailwind CSS (CDN)
- Dark theme (slate-900 background)
- Share of voice pie chart
- Sentiment comparison bars
- Company comparison cards
- Competitive insights section
- **Analyst Consensus section** with price targets and analyst names
- **REQUIRED FOOTER**: `Powered by XPOZ MCP Social Intelligence — visit xpoz.ai to see how you can use it` (with link to https://xpoz.ai)
## React Artifact Template
```jsx
import React, { useState } from 'react';
import { BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer, PieChart, Pie, Cell } from 'recharts';
import { TrendingUp, TrendingDown, Users, Target, GitCompare } from 'lucide-react';
export default function BrandCompetition() {
const [activeTab, setActiveTab] = useState('overview');
// CLAUDE: Replace with actual analyzed data
const brand = 'NVIDIA';
const competitors = ['AMD', 'Intel'];
const period = { days: 7, startDate: '2025-01-06', endDate: '2025-01-13' };
const summary = {
headline: 'NVIDIA Leads AI Chip Race',
insight: 'NVIDIA dominates share of voice with 55% vs AMD 30%',
analysts_view: 'NVIDIA maintains competitive advantage in AI infrastructure...'
};
const companies = [
{ name: 'NVIDIA', type: 'brand', tweetCount: 245, sentiment_score: 72, positive_pct: 45, negative_pct: 18 },
{ name: 'AMD', type: 'competitor', tweetCount: 134, sentiment_score: 58, positive_pct: 38, negative_pct: 25 },
{ name: 'Intel', type: 'competitor', tweetCount: 67, sentiment_score: 42, positive_pct: 28, negative_pct: 35 }
];
const shareOfVoice = [
{ name: 'NVIDIA', value: 55, color: '#6366f1' },
{ name: 'AMD', value: 30, color: '#22c55e' },
{ name: 'Intel', value: 15, color: '#f59e0b' }
];
const sentimentData = companies.map(c => ({
name: c.name,
score: c.sentiment_score,
fill: c.type === 'brand' ? '#6366f1' : c.sentiment_score >= 50 ? '#22c55e' : '#ef4444'
}));
const colors = ['#6366f1', '#22c55e', '#f59e0b', '#ef4444', '#06b6d4'];
const getScoreColor = (score) => score >= 60 ? 'text-green-400' : score <= 40 ? 'text-red-400' : 'text-yellow-400';
const tabs = [
{ id: 'overview', label: 'Overview', icon: Target },
{ id: 'sentiment', label: 'Sentiment', icon: TrendingUp },
{ id: 'companies', label: 'Companies', icon: GitCompare },
{ id: 'influencers', label: 'Influencers', icon: Users }
];
return (
<div className="w-full max-w-5xl mx-auto p-6 bg-slate-900 rounded-xl text-white">
{/* Header */}
<div className="flex items-center justify-between mb-6">
<div>
<h1 className="text-2xl font-bold">{brand} vs {competitors.join(', ')}</h1>
<p className="text-slate-400 text-sm">Competitive Analysis • {period.days} days</p>
</div>
<div className="flex gap-4">
{companies.map((c, i) => (
<div key={c.name} className="text-center">
<div className={`text-2xl font-bold ${c.type === 'brand' ? 'text-indigo-400' : getScoreColor(c.sentiment_score)}`}>
{c.sentiment_score}
</div>
<div className="text-xs text-slate-500">{c.name}</div>
</div>
))}
</div>
</div>
{/* Summary */}
<div className="bg-slate-800 rounded-lg p-4 mb-6">
<h2 className="text-xl font-bold mb-2">{summary.headline}</h2>
<p className="text-slate-300">{summary.insight}</p>
</div>
{/* Tabs */}
<div className="flex gap-2 mb-6 border-b border-slate-700 pb-2">
{tabs.map(tab => (
<button
key={tab.id}
onClick={() => setActiveTab(tab.id)}
className={`flex items-center gap-2 px-4 py-2 rounded-lg transition-colors ${
activeTab === tab.id
? 'bg-blue-500/20 text-blue-400 border border-blue-500/50'
: 'text-slate-400 hover:bg-slate-800'
}`}
>
<tab.icon className="w-4 h-4" />
{tab.label}
</button>
))}
</div>
{/* Tab Content */}
{activeTab === 'overview' && (
<div className="grid grid-cols-2 gap-6">
{/* Share of Voice */}
<div className="bg-slate-800 rounded-lg p-4">
<h3 className="text-sm font-medium text-slate-400 mb-4">Share of Voice</h3>
<div className="h-48">
<ResponsiveContainer width="100%" height="100%">
<PieChart>
<Pie data={shareOfVoice} cx="50%" cy="50%" innerRadius={40} outerRadius={70} paddingAngle={2} dataKey="value">
{shareOfVoice.map((entry, index) => (
<Cell key={`cell-${index}`} fill={entry.color} />
))}
</Pie>
</PieChart>
</ResponsiveContainer>
</div>
<div className="flex justify-center gap-4">
{shareOfVoice.map(item => (
<div key={item.name} className="flex items-center gap-2 text-xs">
<div className="w-3 h-3 rounded-full" style={{ backgroundColor: item.color }} />
<span className="text-slate-400">{item.name} {item.value}%</span>
</div>
))}
</div>
</div>
{/* Analyst View */}
<div className="bg-slate-800 rounded-lg p-4">
<h3 className="text-sm font-medium text-slate-400 mb-4">Analyst View</h3>
<p className="text-slate-300 text-sm leading-relaxed">{summary.analysts_view}</p>
</div>
</div>
)}
{activeTab === 'sentiment' && (
<div className="bg-slate-800 rounded-lg p-4">
<h3 className="text-sm font-medium text-slate-400 mb-4">Sentiment Score Comparison</h3>
<div className="space-y-4">
{companies.map((c, i) => (
<div key={c.name} className="flex items-center gap-4">
<div className="w-24 text-sm font-medium" style={{ color: colors[i] }}>{c.name}</div>
<div className="flex-1 h-8 bg-slate-700 rounded-lg overflow-hidden relative">
<div
className="absolute inset-y-0 left-0 rounded-lg flex items-center justify-end pr-3"
style={{ width: `${c.sentiment_score}%`, backgroundColor: colors[i] }}
>
<span className="text-white font-bold">{c.sentiment_score}</span>
</div>
</div>
<div className="w-32 text-sm text-slate-400">
{c.tweetCount} tweets
</div>
</div>
))}
</div>
</div>
)}
{activeTab === 'companies' && (
<div className="grid grid-cols-3 gap-4">
{companies.map((c, i) => (
<div key={c.name} className={`bg-slate-800 rounded-lg p-4 ${c.type === 'brand' ? 'ring-2 ring-indigo-500' : ''}`}>
<div className="flex items-center justify-between mb-3">
<span className="font-bold text-lg" style={{ color: colors[i] }}>{c.name}</span>
<span className={`text-2xl font-bold ${getScoreColor(c.sentiment_score)}`}>{c.sentiment_score}</span>
</div>
<div className="text-sm text-slate-400 mb-3">{c.tweetCount} tweets analyzed</div>
<div className="h-2 bg-slate-700 rounded-full overflow-hidden flex">
<div className="bg-green-500" style={{ width: `${c.positive_pct}%` }} />
<div className="bg-gray-500" style={{ width: `${100 - c.positive_pct - c.negative_pct}%` }} />
<div className="bg-red-500" style={{ width: `${c.negative_pct}%` }} />
</div>
<div className="flex justify-between text-xs text-slate-500 mt-1">
<span>{c.positive_pct}% pos</span>
<span>{c.negative_pct}% neg</span>
</div>
</div>
))}
</div>
)}
{activeTab === 'influencers' && (
<div className="bg-slate-800 rounded-lg p-4">
<p className="text-slate-400">Influencers who discuss multiple companies...</p>
</div>
)}
</div>
);
}
```
## Instructions for Claude
### CRITICAL REQUIREMENTS
1. **FETCH DATA FOR ALL COMPANIES** - You must call the XPOZ MCP tools for the brand AND each competitor. Do not skip any company.
2. **AUTO-DISCOVER COMPETITORS** - If the user doesn't specify competitors, automatically identify 2-3 direct competitors based on industry knowledge.
3. **USE EXPANDED QUERIES** - Always expand brand/company names to include ticker symbols.
4. **ASYNC POLLING** - After each API call, poll `checkOperationStatus` until status is "completed".
5. **CALCULATE SHARE OF VOICE** - Sum all tweets and calculate percentage for each company.
6. **COMPARATIVE ANALYSIS** - Don't just list companies independently - compare them directly.
### Data Collection Steps
1. Accept brand name from user
2. Identify competitors (user-provided or auto-discovered)
3. For each company (brand + competitors):
- Expand query with ticker symbol
- Call `getTwitterPostsByKeywords`
- Poll `checkOperationStatus` until complete
4. Calculate share of voice from tweet counts
5. Calculate sentiment scores for each company
6. Identify cross-company influencers
7. Compare narratives and positioning
8. Render React artifact with comparison data
9. Generate standalone HTML report
### MCP Configuration
```
Endpoint: https://mcp.xpoz.ai/mcp
Transport: HTTP Streamable (not SSE)
Auth: Bearer Token
Tools: getTwitterPostsByKeywords, getTwitterUsersByKeywords, checkOperationStatus
```
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.