Analyzes Twitter/X tweets for brand sentiment (5 levels), extracts narratives, identifies influencers, and generates SWOT using XPOZ MCP APIs. For brand snapshot or sentiment requests.
How this skill is triggered — by the user, by Claude, or both
Slash command
/xpoz-social-intelligence:brand-snapshotThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill provides comprehensive single-brand intelligence analysis from Twitter/X data. It fetches real tweets, extracts sentiment and narratives, identifies key influencers, and generates a SWOT analysis with actionable insights.
This skill provides comprehensive single-brand intelligence analysis from Twitter/X data. It fetches real tweets, extracts sentiment and narratives, identifies key influencers, and generates a SWOT analysis with actionable insights.
Activate this skill when the user asks about:
Before fetching data, expand the brand name to capture all mentions:
| Brand | Expanded Query |
|---|---|
| NVIDIA | "NVIDIA" OR "$NVDA" |
| Tesla | "Tesla" OR "$TSLA" |
| Apple | "Apple" OR "$AAPL" |
| Microsoft | "Microsoft" OR "$MSFT" |
| AMD | "AMD" OR "$AMD" |
For other brands, include the ticker symbol if publicly traded.
Use getTwitterPostsByKeywords with:
- query: Expanded query (e.g., "NVIDIA" OR "$NVDA")
- fields: ["id", "text", "authorUsername", "createdAtDate", "likeCount", "retweetCount", "quoteCount"]
- startDate/endDate: Last 7 days (YYYY-MM-DD format)
- userPrompt: "Fetching tweets about [BRAND] for sentiment analysis"
CRITICAL: Async Polling Pattern
operationId like op_getTwitterPostsByKeywords_abc123checkOperationStatus with that operationIdUse getTwitterUsersByKeywords with:
- query: Same expanded query
- fields: ["id", "username", "name", "description", "followersCount"]
- userPrompt: "Finding influencers discussing [BRAND]"
Follow the same async polling pattern.
From the fetched tweets:
Sentiment Classification (5-Level):
Narrative Extraction: Identify 5+ recurring themes/narratives from the tweets:
Influencer Classification:
{
"reportType": "snapshot",
"brand": "NVIDIA",
"period": {
"days": 7,
"startDate": "2025-01-06",
"endDate": "2025-01-13"
},
"summary": {
"headline": "NVIDIA Dominates AI Chip Narrative (max 10 words)",
"insight": "Key insight in max 20 words",
"analysts_view": "2-3 sentence professional analysis with citations"
},
"analysts_cited": ["Dan Ives (Wedbush)", "Patrick Moorhead (Moor Insights)"],
"tweetCount": 245,
"sentiment_score": 72,
"positive_pct": 45,
"neutral_pct": 37,
"negative_pct": 18,
"narratives": [
{
"title": "AI Infrastructure Dominance",
"sentiment": "positive",
"detail": "2-3 sentence explanation with specific tweet examples"
}
],
"swot": {
"strengths": ["Strong market position", "Technology leadership"],
"weaknesses": ["Supply chain concerns", "Valuation concerns"],
"opportunities": ["Enterprise AI adoption", "New product launches"],
"threats": ["Competition from AMD", "Regulatory scrutiny"]
},
"influencers": [
{
"username": "@tech_analyst",
"name": "Tech Analyst",
"followers": 125000,
"description": "Bio text",
"voice_type": "analyst",
"sentiment": "positive",
"sample_tweet": {
"text": "Actual tweet quote...",
"likes": 1500,
"retweets": 320
}
}
],
"key_quotes": [
"@user: Actual high-engagement tweet about the brand..."
]
}
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 { PieChart, Pie, Cell, BarChart, Bar, XAxis, YAxis, Tooltip, ResponsiveContainer } from 'recharts';
import { TrendingUp, TrendingDown, Users, MessageSquare, Target, Shield, AlertTriangle, Lightbulb } from 'lucide-react';
export default function BrandSnapshot() {
const [activeTab, setActiveTab] = useState('overview');
// CLAUDE: Replace with actual analyzed data
const brand = 'NVIDIA';
const period = { days: 7, startDate: '2025-01-06', endDate: '2025-01-13' };
const summary = {
headline: 'NVIDIA Dominates AI Chip Narrative',
insight: 'Strong positive sentiment driven by data center growth',
analysts_view: 'Analysts remain bullish on NVIDIA\'s AI infrastructure positioning...'
};
const sentiment = {
score: 72,
positive_pct: 45,
neutral_pct: 37,
negative_pct: 18,
tweetCount: 245
};
const breakdown = [
{ name: 'Positive', value: 45, color: '#22c55e' },
{ name: 'Neutral', value: 37, color: '#6b7280' },
{ name: 'Negative', value: 18, color: '#ef4444' }
];
const narratives = [
{ title: 'AI Infrastructure Dominance', sentiment: 'positive', detail: 'Strong narrative around data center GPU demand...' },
{ title: 'Blackwell Architecture Hype', sentiment: 'positive', detail: 'Next-gen architecture generating excitement...' },
{ title: 'Supply Chain Concerns', sentiment: 'negative', detail: 'Some worry about production capacity...' },
{ title: 'Valuation Debates', sentiment: 'neutral', detail: 'Mixed views on current price levels...' },
{ title: 'Competition from AMD', sentiment: 'neutral', detail: 'Discussion of MI300 competitive positioning...' }
];
const swot = {
strengths: ['Market leadership in AI GPUs', 'Strong software ecosystem (CUDA)', 'Data center revenue growth'],
weaknesses: ['High valuation multiples', 'Customer concentration risk', 'Supply constraints'],
opportunities: ['Enterprise AI adoption wave', 'Automotive AI expansion', 'Edge computing growth'],
threats: ['AMD MI300 competition', 'Custom AI chips from hyperscalers', 'Geopolitical tensions']
};
const influencers = [
{ username: '@tech_analyst', name: 'Tech Analyst', followers: 125000, voice_type: 'analyst', sentiment: 'positive' },
{ username: '@ai_investor', name: 'AI Investor', followers: 89000, voice_type: 'trader', sentiment: 'positive' },
{ username: '@chip_watcher', name: 'Chip Watcher', followers: 56000, voice_type: 'news', sentiment: 'neutral' }
];
const getScoreColor = (score) => score >= 60 ? 'text-green-400' : score <= 40 ? 'text-red-400' : 'text-yellow-400';
const getSentimentIcon = (s) => s === 'positive' ? <TrendingUp className="w-4 h-4 text-green-400" /> : s === 'negative' ? <TrendingDown className="w-4 h-4 text-red-400" /> : <span className="text-gray-400">-</span>;
const voiceTypeBadge = (type) => {
const styles = {
analyst: 'bg-blue-500/20 text-blue-400 border-blue-500/30',
trader: 'bg-green-500/20 text-green-400 border-green-500/30',
news: 'bg-amber-500/20 text-amber-400 border-amber-500/30',
official: 'bg-purple-500/20 text-purple-400 border-purple-500/30',
influencer: 'bg-pink-500/20 text-pink-400 border-pink-500/30',
researcher: 'bg-cyan-500/20 text-cyan-400 border-cyan-500/30'
};
return styles[type] || styles.influencer;
};
const tabs = [
{ id: 'overview', label: 'Overview', icon: Target },
{ id: 'narratives', label: 'Narratives', icon: MessageSquare },
{ id: 'swot', label: 'SWOT', icon: Shield },
{ id: 'influencers', label: 'Influencers', icon: Users }
];
return (
<div className="w-full max-w-4xl 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} Brand Snapshot</h1>
<p className="text-slate-400 text-sm">{sentiment.tweetCount.toLocaleString()} tweets • {period.days} days</p>
</div>
<div className="text-right">
<div className={`text-4xl font-bold ${getScoreColor(sentiment.score)}`}>{sentiment.score}</div>
<div className="text-slate-400 text-sm">sentiment score</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">
<div className="bg-slate-800 rounded-lg p-4">
<h3 className="text-sm font-medium text-slate-400 mb-4">Sentiment Breakdown</h3>
<div className="h-48">
<ResponsiveContainer width="100%" height="100%">
<PieChart>
<Pie data={breakdown} cx="50%" cy="50%" innerRadius={40} outerRadius={70} paddingAngle={2} dataKey="value">
{breakdown.map((entry, index) => (
<Cell key={`cell-${index}`} fill={entry.color} />
))}
</Pie>
</PieChart>
</ResponsiveContainer>
</div>
<div className="flex justify-center gap-4">
{breakdown.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>
<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 === 'narratives' && (
<div className="space-y-4">
{narratives.map((n, i) => (
<div key={i} className="bg-slate-800 rounded-lg p-4 flex items-start gap-4">
<div className="mt-1">{getSentimentIcon(n.sentiment)}</div>
<div>
<h4 className="font-medium text-white">{n.title}</h4>
<p className="text-slate-400 text-sm mt-1">{n.detail}</p>
</div>
</div>
))}
</div>
)}
{activeTab === 'swot' && (
<div className="grid grid-cols-2 gap-4">
<div className="bg-green-500/10 rounded-lg p-4 border border-green-500/20">
<h4 className="font-medium text-green-400 mb-3 flex items-center gap-2"><Shield className="w-4 h-4" /> Strengths</h4>
<ul className="space-y-2">{swot.strengths.map((s, i) => <li key={i} className="text-slate-300 text-sm">• {s}</li>)}</ul>
</div>
<div className="bg-red-500/10 rounded-lg p-4 border border-red-500/20">
<h4 className="font-medium text-red-400 mb-3 flex items-center gap-2"><AlertTriangle className="w-4 h-4" /> Weaknesses</h4>
<ul className="space-y-2">{swot.weaknesses.map((w, i) => <li key={i} className="text-slate-300 text-sm">• {w}</li>)}</ul>
</div>
<div className="bg-blue-500/10 rounded-lg p-4 border border-blue-500/20">
<h4 className="font-medium text-blue-400 mb-3 flex items-center gap-2"><Lightbulb className="w-4 h-4" /> Opportunities</h4>
<ul className="space-y-2">{swot.opportunities.map((o, i) => <li key={i} className="text-slate-300 text-sm">• {o}</li>)}</ul>
</div>
<div className="bg-amber-500/10 rounded-lg p-4 border border-amber-500/20">
<h4 className="font-medium text-amber-400 mb-3 flex items-center gap-2"><Target className="w-4 h-4" /> Threats</h4>
<ul className="space-y-2">{swot.threats.map((t, i) => <li key={i} className="text-slate-300 text-sm">• {t}</li>)}</ul>
</div>
</div>
)}
{activeTab === 'influencers' && (
<div className="grid grid-cols-3 gap-4">
{influencers.map((inf, i) => (
<div key={i} className="bg-slate-800 rounded-lg p-4">
<div className="flex items-center justify-between mb-2">
<span className="font-medium text-white">{inf.name}</span>
<span className={`text-xs px-2 py-1 rounded border ${voiceTypeBadge(inf.voice_type)}`}>{inf.voice_type}</span>
</div>
<p className="text-slate-500 text-sm">{inf.username}</p>
<p className="text-slate-400 text-sm mt-1">{(inf.followers / 1000).toFixed(0)}K followers</p>
</div>
))}
</div>
)}
</div>
);
}
FETCH REAL DATA - You MUST call the XPOZ MCP tools and fetch real tweets. Do NOT generate fake data or skip API calls.
USE EXPANDED QUERIES - Always expand brand names to include ticker symbols:
"NVIDIA" OR "$NVDA""Tesla" OR "$TSLA"ASYNC POLLING - After calling getTwitterPostsByKeywords or getTwitterUsersByKeywords, you MUST poll checkOperationStatus until status is "completed".
MINIMUM DATA - Fetch at least 200 tweets and 50 influencers for reliable analysis.
REAL QUOTES - The key_quotes and sample_tweet fields must contain actual tweets from the fetched data, not fabricated examples.
ANALYST CITATIONS - In analysts_view, cite real analysts/journalists by name with affiliation if mentioned in tweets.
getTwitterPostsByKeywords with expanded querycheckOperationStatus until completegetTwitterUsersByKeywords with same querycheckOperationStatus 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.
Monitors brand reputation and sentiment across Twitter/X, Reddit, Instagram, YouTube, and LinkedIn using the anysite MCP server. Tracks mentions, analyzes sentiment, and detects reputation risks.
Collects live mentions of a brand across social platforms, news, and reviews using Bright Data, then classifies sentiment and clusters themes into a cited digest with recommendations.