Analyzes brand vs competitors using XPOZ MCP Twitter data for share of voice, sentiment scores, and positioning. Activates on 'compare X vs Y' or competitive analysis queries.
How this skill is triggered — by the user, by Claude, or both
Slash command
/xpoz-social-intelligence:brand-competitionThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
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.
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.
Activate this skill when the user asks about:
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 |
Expand each brand name to include ticker symbols:
NVIDIA → "NVIDIA" OR "$NVDA"
AMD → "AMD" OR "$AMD"
Intel → "Intel" OR "$INTC"
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
operationIdcheckOperationStatus with that operationIdFind influencers who mention multiple companies:
Use getTwitterUsersByKeywords with:
- query: "NVIDIA" OR "AMD" OR "Intel" (all companies combined)
- fields: ["id", "username", "name", "followersCount", "description"]
Share of Voice:
company_share = company_tweets / total_tweets * 100
Sentiment Comparison (5-Level Scale):
Competitive Positioning:
{
"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"
}
}
Generate a standalone HTML report with:
Powered by XPOZ MCP Social Intelligence — visit xpoz.ai to see how you can use it (with link to https://xpoz.ai)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>
);
}
FETCH DATA FOR ALL COMPANIES - You must call the XPOZ MCP tools for the brand AND each competitor. Do not skip any company.
AUTO-DISCOVER COMPETITORS - If the user doesn't specify competitors, automatically identify 2-3 direct competitors based on industry knowledge.
USE EXPANDED QUERIES - Always expand brand/company names to include ticker symbols.
ASYNC POLLING - After each API call, poll checkOperationStatus until status is "completed".
CALCULATE SHARE OF VOICE - Sum all tweets and calculate percentage for each company.
COMPARATIVE ANALYSIS - Don't just list companies independently - compare them directly.
getTwitterPostsByKeywordscheckOperationStatus until completeEndpoint: https://mcp.xpoz.ai/mcp
Transport: HTTP Streamable (not SSE)
Auth: Bearer Token
Tools: getTwitterPostsByKeywords, getTwitterUsersByKeywords, checkOperationStatus
npx claudepluginhub xpozpublic/xpoz-claude-code-pluginsCompares brands and products across social media using Xpoz: share of voice, sentiment, positioning, and audience overlap. Useful for competitive analysis.
Calculates and tracks share of voice across organic search, paid search, social media, and AI engine citations. Useful for competitive visibility analysis and market share forecasting.
Analyzes competitor brands using positioning, messaging, voice, and visual frameworks. Scores competitors, benchmarks against your brand, and identifies market positioning gaps.