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".
Scanned 8/30/2026
Install to Claude Code
npx -y skills add XPOZpublic/xpoz-claude-code-plugins --skill brand-competition --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Brand Competition?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/xpozpublic-brand-competition)More formats (shields.io, HTML) on the badges page.
---
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
```
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!